JZOJ3223 Ede的新背包问题
Description
Input
Output
输出 q行,第 i行输出对于第 i个询问的答案。
Sample Input
5
2 3 4
1 2 1
4 1 2
2 1 1
3 2 3
5
1 10
2 7
3 4
4 8
0 5
Sample Output
13
11
6
12
4
Data Constraint
Hint
Solution
分别从正反两个方向做多重背包,每次去掉的玩偶x和新的价钱y的最优方案就是
max(f[x][y-j]+ff[x+2][j])
注意玩偶的编号从0开始
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 struct arr 5 { 6 int x,y,w; 7 }s[1010]; 8 struct aar 9 { 10 int x,y; 11 }t[1010]; 12 int n,m,f[1010][1010],ff[1010][1010]; 13 int max(int x,int y) 14 { 15 if (x>y) return x; 16 return y; 17 } 18 int ss(int x) 19 { 20 for (int i=1;i<=n;i++) 21 { 22 for (int j=0;j<=x;j++) 23 f[i][j]=f[i-1][j]; 24 for (int j=1;j<=s[i].w;j++) 25 for (int k=x;k>=s[i].x;k--) 26 f[i][k]=max(f[i][k-s[i].x]+s[i].y,f[i][k]); 27 } 28 } 29 int sss(int x) 30 { 31 for (int i=n;i>=1;i--) 32 { 33 for (int j=0;j<=x;j++) 34 ff[i][j]=ff[i+1][j]; 35 for (int j=1;j<=s[i].w;j++) 36 for (int k=x;k>=s[i].x;k--) 37 ff[i][k]=max(ff[i][k-s[i].x]+s[i].y,ff[i][k]); 38 } 39 } 40 int main() 41 { 42 scanf("%d",&n); 43 for (int i=1;i<=n;i++) 44 scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].w); 45 scanf("%d",&m); 46 ss(1000); 47 sss(1000); 48 for (int i=1;i<=m;i++) 49 { 50 int mi=0,x,y; 51 scanf("%d%d",&x,&y); 52 for (int j=0;j<=y;j++) 53 mi=max(mi,f[x][y-j]+ff[x+2][j]); 54 printf("%d\n",mi); 55 } 56 57 }