UVA624(01背包记录路径)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=565
01背包打印路径。
#include <cstdio> #include <cstring> using namespace std; const int MAXN=10005; int n,W; int w[30]; int dp[MAXN]; int vis[30][MAXN]; int main() { while(scanf("%d%d",&W,&n)!=EOF) { memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { scanf("%d",&w[i]); } for(int i=0;i<n;i++) { for(int j=W;j>=w[i];j--) { if(dp[j-w[i]]+w[i]>dp[j]) { dp[j]=dp[j-w[i]]+w[i]; vis[i][j]=1; } } } for(int i=n-1,j=W;i>=0;i--) { if(vis[i][j]) { printf("%d ",w[i]); j-=w[i]; } } printf("sum:%d\n",dp[W]); } return 0; }