1 条题解

  • 0
    @ 2022-6-12 10:19:33
    #include <iostream>
    #include<cstdio>
    #define maxn 32005
    using namespace std;
    int n,m,iw,ii,ib;
    int w[maxn],c[maxn],bw[maxn][3],bc[maxn][3],dp[maxn];
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
        	scanf("%d%d%d",&iw,&ii,&ib);
            if(!ib){
                w[i]=iw;
                c[i]=iw*ii;
            }else{
                bw[ib][++bw[ib][0]]=iw;
                bc[ib][bw[ib][0]]=iw*ii;
            }
    	}
        for(int i=1;i<=m;i++){
        	for(int j=n;w[i]!=0&&j>=w[i];j--){//类似零一背包,就是多考虑是否选附件 
                dp[j]=max(dp[j],dp[j-w[i]]+c[i]);
                if(j>=w[i]+bw[i][1])//考虑选附件1,就是现在的钱j够用 
                    dp[j]=max(dp[j],dp[j-w[i]-bw[i][1]]+c[i]+bc[i][1]);
                if(j>=w[i]+bw[i][2])//考虑选附件2 
                    dp[j]=max(dp[j],dp[j-w[i]-bw[i][2]]+c[i]+bc[i][2]);
                if(j>=w[i]+bw[i][1]+bw[i][2])//考虑都选 
                    dp[j]=max(dp[j],dp[j-w[i]-bw[i][1]-bw[i][2]]+c[i]+bc[i][1]+bc[i][2]);
            }
    	}
        printf("%d\n",dp[n]);
        return 0;
    }
    
    • 1

    信息

    ID
    93
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    6
    上传者