/* *********************************************** Author :yang12138 Created Time :2017年08月05日 星期六 21时29分28秒 File Name :1004.cpp ************************************************ */ #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) typedef long long ll; typedef pairpii; #define lson (root<<1) #define rson (root<<1|1) const int N=105; const int W=1005; const int INF=1e9; int dp[N][W],sum[N][W]; vectorp[N][W]; int s[N],c[N]; bool check(vector&a,vector&b){ int len=min(a.size(),b.size()); for(int i=0;ib[i]) return 0; } if(a.size()=c[i];j--){ dp[i][j]=dp[i-1][j-c[i]]+s[i]; sum[i][j]=sum[i-1][j-c[i]]+i; p[i][j]=p[i-1][j-c[i]]; p[i][j].push_back(i); } for(int j=0;j<=w;j++){ if(dp[i-1][j]>dp[i][j]){ dp[i][j]=dp[i-1][j]; sum[i][j]=sum[i-1][j]; p[i][j]=p[i-1][j]; } else if(dp[i-1][j]==dp[i][j]){ if(sum[i-1][j]pans; for(int i=0;i<=w;i++){ if(dp[n][i]==ans && tot==sum[n][i]){ if(pans.size()==0) pans=p[n][i],sumcost=i; else if(check(p[n][i],pans)) pans=p[n][i],sumcost=i; } } printf("Case #%d:\n",++t); printf("%d %d\n",ans,sumcost); if(pans.size()){ printf("%d",pans[0]); for(int i=1;i