1 条题解
-
0
虽然是二维费用 但本质上是将多重背包转化为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
- 上传者