关于混合背包问题
  • 板块学术版
  • 楼主冬天的雨
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/12/13 09:13
  • 上次更新2023/11/3 22:18:36
查看原帖
关于混合背包问题
130125
冬天的雨楼主2021/12/13 09:13

请问该如何优化一个混合背包?

就是有01,有完全,有多重的那种。。。

#include<cstring>
#include<string>
#include<cstdio>
using namespace std;
int n,m;
int v[150001],w[150001],p[150001];
int dp[10010];
int pre;
int t1,t2,t3,t=1;
int read(){
    int r=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        r=r*10+ch-'0';
        ch=getchar();
    }
    return r;
}
int main(){
    memset(dp,0,sizeof(dp));
    pre=0;
    n=read();
    m=read();
    for(int i=1;i<=n;i++){
        t1=read();
        t2=read();
        t3=read();
        pre++;
        if(t3==0){
            t3=m/t1;
        }
        if(t3*t1>m){
            t3=m/t1;
        }
        while(t3>=t){
            v[pre]=t1*t;
            w[pre]=t2*t;
            t3-=t;
            t*=2;
            pre++;
        }
        pre++;
        v[pre]=t1*t3;
        w[pre]=t2*t3;
        t=1;
    }
    for(int i=1;i<=pre;i++){
        for(int j=m;j>=v[i];j--){
            dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
        }
    }
    printf("%d",dp[m]);
    return 0;
}

RT

n,m小于等于10000

救救孩子吧。。。

2021/12/13 09:13
加载中...