/** * 01背包: * 有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的费用是 Ci,得到的 价值是 Wi。 * 求解将哪些物品装入背包可使价值总和最大。 * 伪码: * F[0..V ]←0 for i ← 1 to N * for v ← V to Ci * F[v] ←max{F[v],F[v−Ci] + Wi} * */ #include <stdio.h> #include <string.h> #define maxn 1005 int max(int a, int b){ if (a > b)return a; return b; } int main() { int t; scanf("%d", &t); while (t--) { int n, V; int v[maxn], w[maxn], dp[maxn]; memset(dp, 0, sizeof(dp)); scanf("%d%d", &n, &V); for (int i = 1; i <= n; i++) scanf("%d", &w[i]); for (int i = 1; i <= n; i++) scanf("%d", &v[i]); for (int i = 1; i <= n; i++) for (int vo = V; vo >= v[i]; vo--){ //枚举所有可以装入i石块的情况 dp[vo] = max(dp[vo], dp[vo - v[i]] + w[i]); } printf("%d\n", dp[V]); } return 0; } /* 1 5 10 1 2 3 4 5 5 4 3 2 1 ** 14 */