HDU 2844 Coins 背包问题之多重背包
来源:互联网 发布:傲慢与偏见与僵尸 知乎 编辑:程序博客网 时间:2024/06/06 03:46
求是否可以相加得到某个数可以把价值和体积都设置为子数
然后看 dp 结果是否有 dp[i] == i,有就表示可以相加得到,没有则不能。
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#define max(a,b) ((a)>(b) ? (a) : (b))using namespace std;const int MAX = 500 + 5;const int MAXN = 100000 + 5;int a[MAX], c[MAX], dp[MAXN], v, n, ans;void zop(int p, int w){ for(int i = v; i >= p; --i) dp[i] = max(dp[i], dp[i - p] + w);}void cp(int p, int w){ for(int i = p; i <= v; ++i) dp[i] = max(dp[i], dp[i - p] + w);}void mp(int p, int w, int a){ if(p * a >= v){ cp(p, w); return; } for(int i = 1; i < a; a -= i, i <<= 1) zop(p * i, w * i); zop(p * a, w * a);}int main(){ while(~scanf("%d%d", &n, &v) && n + v){ memset(dp, 0, sizeof(dp)); for(int i = 0; i < n; ++i) scanf("%d", a + i); for(int i = 0; i < n; ++i) scanf("%d", c + i); for(int i = 0; i < n; ++i) mp(a[i], a[i], c[i]); ans = 0; for(int i = 1; i <= v; ++i) if(dp[i] == i) ans++; printf("%d\n", ans); } return 0;}
- HDU 2844 Coins 背包问题之多重背包
- HDU 2191 背包问题之多重背包
- hdu 2844 Coins 背包
- hdu 2844 Coins (多重背包问题)
- 背包九讲之多重背包问题
- HDU Coins 【多重背包问题】
- HDU-2844 Coins (多重背包+完全背包)
- hdu 2844 Coins 多重背包
- hdu 2844 Coins 多重背包
- HDU 2844 Coins -- 多重背包
- hdu 2844 Coins - 多重背包
- hdu 2844 Coins(多重背包)
- hdu 2844 Coins 多重背包
- Coins hdu 多重背包 2844
- HDU 2844 Coins 多重背包
- Coins - HDU 2844 背包dp
- HDU 2844 Coins (组合背包)
- HDU 2844 Coins (组合背包)
- Android中Service与Thread的区别
- QQ界面编程,绝佳的学习材料!
- VM下RedHat linux上网配置
- 如何清除局域网中的ARP病毒
- UVa 10066 The Twin Towers (DP&LCS)
- HDU 2844 Coins 背包问题之多重背包
- 查看电脑(服务器)ip地址与名称
- Strange Country II
- ios之C语言基础知识串联
- 11.19C语言----指针变量作为函数参数
- 随意记记
- 使用vector 和map构造二维矩阵和二维表格
- 利用VBA处理Excel 2007中的表
- 第13周作业 她胖吗