这道题显然是一个01背包加上记录路径的题目,要说这道题的原型就是N多年前的CD
本题主要考的就是对01背包的基础板子加上稍微一点点的码力,就可以A掉这个题了
废话不多说,上代码:
#include<bits/stdc++.h> using namespace std; const int maxn=2e3+50; int v[maxn],V,f[maxn],n; int pre[maxn][maxn]; void solve(int V){ for(int i=1;i<=n;i++){ for(int j=V;j>=v[i];j--){ if(f[j]<=f[j-v[i]]+v[i]){ f[j]=f[j-v[i]]+v[i]; pre[j][i]=1; } } } int p[maxn],tot=0,j=V; for(int i=n;i>=1;i--){ if(pre[j][i]){ p[++tot]=v[i]; j-=v[i]; } } for(int i=tot;i>=1;i--)cout<<p[i]<<" "; printf("sum:%d ",f[V]); } int main(){ while(scanf("%d",&V)==1){ scanf("%d",&n); memset(f,0,sizeof(f)); memset(pre,0,sizeof(pre)); for(int i=1;i<=n;i++){ scanf("%d",&v[i]); } solve(V); } return 0; }
大概自己都可以看懂吧,言简意赅,不会的在评论区里评论或q我(3417018747),学会的把学会了扣在评论里(不许扣学废了)
谢谢观看