【bzoj 5390】F.糖果商店(揹包DP)

傳送門biu~
這裏寫圖片描述

#include<bits/stdc++.h>
#define inf 1000000000000000ll
#define N 105
#define M 100005
using namespace std;
int n,m,cnt,w[N],v[N],l[N],d[M];
long long ans,f[M][N];
long long dp(int i,int j){
    if(~f[i][j]) return f[i][j];
    if(j==0){
        for(int x=1;x<=n;++x)
            f[i][j]=max(f[i][j],dp(i,x));
    }
    else{
        if(i>=w[j]) f[i][j]=max(f[i][j],dp(i-w[j],j)+v[j]);
        if(i>=w[j]*l[j]) f[i][j]=max(f[i][j],dp(i-w[j]*l[j],0)-d[i-w[j]*l[j]]+(long long)v[j]*l[j]);
    }
    if(!~f[i][j]) f[i][j]=-inf;
    return f[i][j];
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i) scanf("%d",&d[i]);
    for(int x,y,z,i=1;i<=n;++i){
        scanf("%d%d%d",&x,&y,&z);
        if((long long)x*z>m) continue;
        ++cnt,w[cnt]=x,v[cnt]=y,l[cnt]=z;
    }
    n=cnt;
    memset(f,-1,sizeof f),f[0][0]=0;
    for(int i=1;i<=m;++i){
        ans=max(ans,dp(i,0));
        printf("%lld ",ans);
    }   
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章