题目链接:。。。。。。。。。
新手第一道0-1背包问题
动态方程:dp[j] = max(dp[j], dp[j-V[i]]+W[i]) j为容量, 最后的dp[v]就为求的答案。
code:
#include <stdio.h> #include <string.h> int main() { int i = 0, j = 0, t = 0, n = 0, v = 0; int W[1002], V[1002], dp[1002]; scanf("%d",&t); while(t--) { scanf("%d %d",&n, &v); for(i = 0; i<n; i++) scanf("%d",&W[i]); for(i = 0; i<n; i++) scanf("%d",&V[i]); memset(dp, 0, sizeof(dp)); for(i = 0; i<n; i++) { for(j = v; j>=V[i]; j--)//j表明当前物品的容量 { dp[j] = dp[j]<(dp[j-V[i]]+W[i])? (dp[j-V[i]]+W[i]):dp[j]; } } printf("%d\n",dp[v]); } return 0; }
code:
#include <stdio.h> #include <string.h> int dp[1002][1002]; int main() { int i = 0, j = 0, t = 0, n = 0, v = 0; int W[1002], V[1002]; scanf("%d",&t); while(t--) { scanf("%d %d",&n, &v); for(i = 0; i<n; i++) scanf("%d",&W[i]); for(i = 0; i<n; i++) scanf("%d",&V[i]); memset(dp, 0, sizeof(dp)); for(i = 0; i<V[0]; i++) dp[0][i] = 0; for(i = V[0]; i<=v; i++) dp[0][i] = W[0]; for(i = 1; i<n; i++) { for(j = 0; j<V[i]; j++) dp[i][j] = dp[i-1][j]; for(j = V[i]; j<=v; j++) dp[i][j] = dp[i-1][j]>dp[i-1][j-V[i]]+W[i]? dp[i-1][j]:dp[i-1][j-V[i]]+W[i]; } printf("%d\n",dp[n-1][v]); } return 0; }