背包问题 打印路径是用一个vis数组来存 最后回溯输出
#include <algorithm> #include <cstring> #include <cstdio> using std::max; int n,m,w[25],dp[10010],vis[25][10005]; int main() { while(scanf("%d %d",&m,&n)==2) { for(int i=1; i<=n; i++) scanf("%d",&w[i]); memset(dp, 0, sizeof(dp)); memset(vis, 0, sizeof(vis)); vis[0][0]=1; for(int i=n; i>0; i--) { for(int j=m; j>=w[i]; j--) { dp[j]=max(dp[j],w[i]+dp[j-w[i]]); if(dp[j]==dp[j-w[i]]+w[i]) vis[i][j]=1; } } for(int i=1, j=m; i<=n; i++) if(vis[i][j]) { printf("%d ",w[i]); j-=w[i]; } printf("sum:%d\n",dp[m]); } return 0; }
浙公网安备 33010602011771号