依我看,这个题还是叫卡常背包吧

P1782 旅行商的背包

谁知到这个代码的处理奇货的时候的循环第3层,为什么k 从 j 到 0 就会wa啊 ```cpp #include<iostream> #include<cstdio> #define maxn 10010 #define ll long long using namespace std; int n, t, m, cnt; int f[maxn]; inline void read(int &x){ x = 0; int f = 1; char c = getchar(); while(c < '0' || c > '9'){ if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9'){ x = x * 10 + c - '0'; c = getchar(); } x *= f; } inline int max(int x, int y){ return x > y ? x : y; } int main(){ read(n); read(t); read(m); for(int i = 1; i <= n; i++){ int w, c, p; read(w); read(c); read(p); if(p * w > m){ for(int j = w; j <= m; j++) f[j] = max(f[j], f[j - w] + c); continue; } for(int j = 1; j <= p; j <<= 1){ for(int k = m; k >= w * j; --k) f[k] = max(f[k], f[k - w * j] + c * j); p -= j; } if(p > 0) for(int k = m; k >= w * p; --k) f[k] = max(f[k], f[k - w * p] + c * p); } for(int i = 1; i <= t; i++){ int x, y, z; read(x); read(y); read(z); for(int j = m; j >= 0; j--) for(int k = 0; k <= j; k++) f[j] = max(f[j], f[j - k] + (x * k + y) * k + z); } cout << f[m]; return 0; } ``` 我收回随便A的话
by DDOSvoid @ 2018-01-21 21:42:00


@[DDOSvoid](/space/show?uid=34531) 数据量最大的点已经调整为2s
by yjjr @ 2018-01-22 10:27:09


|