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 }
View Code

 

posted @ 2018-08-25 08:53  kasiruto  阅读(186)  评论(0编辑  收藏  举报