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

*/

你可能感兴趣的:(路径)