您的位置:首页 > 其它

HUT-2602 01背包 记录路径

2012-06-27 12:48 232 查看
#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
[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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: