CD题解(药水的选择)

这道题显然是一个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),学会的把学会了扣在评论里(不许扣学废了)

谢谢观看

原文地址:https://www.cnblogs.com/hzoi-liujiahui/p/12902084.html