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

 

转载于:https://www.cnblogs.com/Tokisaki-Kurumi/p/9532892.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值