P1776 宝物筛选

· · 个人记录


#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,w[100005],v[100005],cnt=0,f[100005];
int main(){
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=n;i++){
        ll a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        for(ll j=1;j<=c;j<<=1){
            w[++cnt]=a*j;
            v[cnt]=b*j;
            c-=j;
        }//将c件分成1,2,4,8 等 2的次幂 与 余下部分
        if(c){
            w[++cnt]=a*c;
            v[cnt]=b*c;
        }
    }
   //多重背包转化为01背包
    for(ll i=1;i<=cnt;i++){
        for(ll j=m;j>=v[i];j--){
            f[j]=max(f[j],f[j-v[i]]+w[i]);
         //滚动数组优化空间
        }
    }
    printf("%lld",f[m]);
    return 0;
}