HUT-2602 01背包 记录路径

#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
*/
posted @ 2012-06-27 12:48  沐阳  阅读(746)  评论(0编辑  收藏  举报