#include <cstdlib> #include <cstring> #include <iostream> using namespace std; int p[1005], w[1005], dp[1005][1005], N, V; void DP() { memset(dp, 0, sizeof (dp)); for (int i = 1; i <= N; ++i) { for (int j = V; j >= 0; --j) { if (j >= w[i] && dp[i-1][j-w[i]] + p[i] > dp[i-1][j]) { dp[i][j] = dp[i-1][j-w[i]] + p[i]; } else { dp[i][j] = dp[i-1][j]; } } } printf("%d\n", dp[N][V]); int T = V; for (int i = N; i >= 0; --i) { for (int j = T; j >= 0; --j) { if (dp[i][j] == dp[i-1][j]) { printf("没有选择该物品!\n"); break; } else if (dp[i][j] == dp[i][j-w[i]]+p[i]) { printf("选取了第%d号物品\n", i); T -= w[i]; break; } } } } int main() { int T; scanf("%d", &T); while (T--) { scanf("%d", &N); scanf("%d", &V); for (int i = 1; i <= N; ++i) { scanf("%d", &p[i]); } for (int i = 1; i <= N; ++i) { scanf("%d", &w[i]); } DP(); } return 0; } /* 5 10 5 5 2 2 5 3 1 6 7 3 */