UVA62401背包,滚动数组,并打印路径

来源:互联网 发布:高并发web架构 java 编辑:程序博客网 时间:2024/06/05 13:33

很典型的01背包问题,小白书上写的很详细,不再讲,这里主要就是怎么打印路径,开一个额外的标记数组就行了,

另外这里没要求打印路径顺序,所以打印就行了。

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cctype>#include<cmath>#include<algorithm>#include<string>#include<map>#include<queue>#include<stack>#include<set>#include<vector>#define LL long longusing namespace std;const int maxn=1e5+10;const double eps=1e-6;//const int  MAX_INT=(1<<31)-1;int n,m,a[30],dp[maxn];bool vis[maxn][30];int main(){while(cin>>n>>m){memset(dp,0,sizeof(dp));memset(vis,0,sizeof(vis));for(int i=0;i<m;i++)cin>>a[i];for(int i=0;i<m;i++)for(int j=n;j>=a[i];j--){if(dp[j]<=dp[j-a[i]]+a[i]){dp[j]=dp[j-a[i]]+a[i];vis[j][i]=1;} } for(int i=m-1,j=n;i>=0;i--) { if(vis[j][i]) { printf("%d ",a[i]); j-=a[i]; }  }   printf("sum:%d\n",dp[n]);}return 0;}


0 0
原创粉丝点击