解析:
01背包,输出路径时由上一个状态推出下一个状态。
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 50;
const int MAX = 5000;
int dp[N][MAX];
int rec[N][MAX];
int w[N];
int main() {
int n,V;
while(scanf("%d",&V) != EOF) {
scanf("%d",&n);
for(int i = 1; i <= n; i++) {
scanf("%d",&w[i]);
}
memset(dp,0,sizeof(dp));
memset(rec,0,sizeof(dp));
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= V; j++) {
dp[i][j] = dp[i-1][j];
if(j >= w[i]) {
if(dp[i][j] < dp[i-1][j - w[i]] + w[i]) {
dp[i][j] = dp[i-1][j - w[i]] + w[i];
rec[i][j] = true;
}
}
}
}
int tmp = V;
for(int i = n; i > 0; i--) {
if(rec[i][tmp]) {
printf("%d ",w[i]);
tmp -= w[i];
}
}
printf("sum:%d\n",dp[n][V]);
}
return 0;
}
本文介绍了一种解决01背包问题的方法,并通过C++代码实现了动态规划算法来找到最大价值及对应的物品选择方案。利用二维数组记录最优解的状态转移过程,最终输出选中的物品及其总价值。
1010

被折叠的 条评论
为什么被折叠?



