1 条题解

  • 0
    @ 2023-5-24 9:34:05

    虽然是二维费用 但本质上是将多重背包转化为01背包

    code:

    #include <bits/stdc++.h>
    #define int long long int
    
    using namespace std;
    
    const int N = 1e3 + 70;
    int n,pg,rune,cnt;
    tni f[N][N];
    
    struct node{
    	int Pg,Rune,s,power;
    }a[N];
    
    struct Bag{
    	int Pg,Rune,power;
    }w[N];
    
    inline int read(){
    	int x = 0,f = 1;
    	char c = getchar();
    	for(;!isdigit(c);c = getchar())
    		if(c == '-')f = -1;
    	for(;isdigit(c);c = getchar())
    		x = (x << 1) + (x << 3) + c - '0';
    	return x * f;
    }
    
    inline void fast(){
    	for(register int i = 1;i <= n; i++){
    		int k = 1;
    		while(a[i].s){
    			w[++ cnt].Pg = a[i].Pg * k;
    			w[cnt].Rune = a[i].Rune * k;
    			w[cnt].power = a[i].power * k;
    			a[i].s -= k;
    			k <<= 1;
    			if(k >= a[i].s){
    				w[++ cnt].Pg = a[i].Pg * a[i].s;
    				w[cnt].Rune = a[i].Rune * a[i].s;
    				w[cnt].power = a[i].power * a[i].s;
    				a[i].s = 0;
    			}
    		}
    	}
    }	
    
    signed main(){
    	n = read();pg = read();rune = read();
    	for(register int i = 1;i <= n;i ++){
    		a[i].Pg = read();
    		a[i].Rune = read();
    		a[i].s = read();
    		a[i].power = read();
    		if(!a[i].s) a[i].s = 64;//能无限取就赋个理论上的INF值
    //64实际上小了,应该赋个100对应pg = 1,rune = 1的情况
    	}
    	fast();//快速幂优化
    	for(register int k = 1;k <= cnt;k ++){
    		for(register int i = pg;i >= w[k].Pg;i --){
    			for(register inn j = rune;j >= w[k].Rune;j --){
    				f[i][j] = max(f[i][j],f[i - w[k].Pg][j - w[k].Rune] + w[k].power);
    			}
    		}
    	}
    	printf("%lld",f[pg][rune]);
        return 0;
    }
    
    • 1

    信息

    ID
    357
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    8
    已通过
    2
    上传者