Memory Limit: 65535/32768 K (Java/Others)
3 3 3 7 7 9 9 10 5 1 1 5 3 10 3 6 8 7 5 6
10 20
介绍:
完全背包:有N种物品和一个容量为V的背包,每种物品都有无限件可用。放入第i种物品的价值是Wi,所占空间是Ci。
求解:将哪些物品装入背包,可使这些物品体积总和不超过背包容量,且价值总和最大。
题目可以转化为在Σ(i=1~N) kiCi <= V 的情况下求Σ(i=1~N) kiWi 的最大值。
思路:
比较在同等空间上限的情况下,加上这件物品还是保持原来的物品。
temp = f[j - c[i]] + w[i]; if (f[j] < temp) f[j] = temp;
读者可以画一个以 i 为纵轴(代表物品种类),j 为横轴(代表体积)的f[j]表试试,直观形象。
完整代码:
/*109ms,620KB*/ #include<cstdio> #include<cstring> using namespace std; const int MAXN = 102; const int MAXM = 100002; int w[MAXN], c[MAXN]; int f[MAXM]; int main(void) { int n = 0, v = 0, temp; while (~scanf("%d", &n)) { memset(f, 0, sizeof(f)); for (int i = 1; i <= n; i++) scanf("%d%d", &w[i], &c[i]); scanf("%d", &v); ///////////////////////////////// for (int i = 1; i <= n; i++) { for (int j = 0; j <= v; j++) { if (j >= c[i]) { temp = f[j - c[i]] + w[i]; if (f[j] < temp) f[j] = temp; } } } printf("%d\n", f[v]); } }