解析:
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;
}