hdu 2602 Bone Collector(01背包)
#include <iostream> #include <stdio.h> #include <string.h> const int maxn = 1e3 + 5; int val[maxn]; int vol[maxn]; int f[maxn][maxn]; using namespace std; int main() { int t, n, v; scanf("%d", &t); while(t--){ scanf("%d%d", &n, &v); for(int i = 1; i <= n; i++){ scanf("%d", &val[i]); } for(int i = 1; i <= n; i++){ scanf("%d", &vol[i]); } memset(f, 0, sizeof(f)); //状态转移方程 for(int i = 1; i <= n; i++){ for(int j = 0; j <= v; j++){ if(j >= vol[i]) //前i件物品放进体积为j的背包中的最大价值 f[i][j] = max(f[i - 1][j], f[i - 1][j - vol[i]] + val[i]); //前i-1键物品放进体积为j-vol[i]的背包中,再加上第i个物品的价值,这里的条件是体积j大于vol[i]的体积 else //前i-1件物品放进体积为j的背包中的价值 f[i][j] = f[i - 1][j]; } } int ans = 0; for(int i = 0; i <= v; i++){ ans = max(ans, f[n][i]); } printf("%d\n", ans); } return 0; }