01背包。 不仅要求出最大的。还要求出最大的由那些构成。
多定义一个path[]就可以了。
应该是 Special Judge
我样例最后一组输出的是 43 2 sum:45
样例输出的是 4 10 12 9 8 2 sum:45
不过也AC了。
#include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<stack> #include<iostream> #include<list> #include<set> #include<vector> #include<cmath> #define INF 0x7fffffff #define eps 1e-8 #define LL long long #define PI 3.141592654 #define CLR(a,b) memset(a,b,sizeof(a)) #define FOR(i,a,b) for(int i=a;i<b;i++) #define FOR_(i,a,b) for(int i=a;i>=b;i--) #define pb push_back #define mp make_pair #define ft first #define sd second #define sf scanf #define pf printf #define sz(v) ((int)(v).size()) #define all(v) (v).begin(),(v).end() #define acfun std::ios::sync_with_stdio(false) #define SIZE 100000 +1 using namespace std; int n,m; int path[SIZE]; int a[21]; int dp[SIZE]; void zeroonepack(int cost,int value) { FOR_(i,m,cost) { //dp[i]=max(dp[i],dp[i-cost]+value); if(dp[i-cost]+value>dp[i]) { dp[i]=dp[i-cost]+value; path[i]=i-cost; } } } int main() { while(~sf("%d%d",&m,&n)) { FOR(i,0,n) sf("%d",&a[i]); CLR(dp,0); CLR(path,-1); FOR(i,0,n) zeroonepack(a[i],a[i]); int ans=0,k=-1; FOR(i,0,m+1) { if(dp[i]>ans) ans=dp[i],k=i; } stack<int>out; while(path[k]!=-1) { //pf("%d ",k-path[k]); out.push(k-path[k]); k=path[k]; } while(!out.empty()) { pf("%d ",out.top()); out.pop(); } pf("sum:%d\n",ans); } }
原文地址:http://blog.csdn.net/dongshimou/article/details/41011515