ZOJ 3264 Present for MM

题目描述:

  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3566

解题思路:

  这有点像背包问题,我没研究过。反正我是这样做的:dp[w]中存的是重量w下最大的v,我没有从dp[w-1]推到dp[w]这样状态转移,

  我只是从每次加一个重量时,去处理(用了insertValue函数)。其实,1,2,3三种情况我都把它转化成在原来的dp[]中插入w1,v1,w2

  ,v2,其中第一种就是(w1+w2, v1+v2), (w1, 0), (w2, 0)三种情况,把他们的值存入t[]中,然后取最大的最后放入dp[]中;那么第二种

  就是(w1,v1), (w2,v2)两种情况的筛选;第三种就是(w1,v1),(w1 + w2, v1 + v2);

  最后遍历一遍,最大的值就是答案。

代码:

 1 #include <iostream>
 2 #include <stdlib.h>
 3 #include <string>
 4 #include <cstring>
 5 using namespace std;
 6 int N ;
 7 int t[50001];
 8 int dp[50001];
 9 void insertValue(int w1, int v1, int w2, int v2)
10 {
11     int i, j;
12     memset(t, -1, sizeof t);
13     for(i = 0; i < N; i ++)
14         if(dp[i] != -1 && i + w1 < N)
15             t[i+w1] = dp[i] + v1;
16     if(v2 != 0) 
17     {
18         for(i = 0; i < N; i ++)
19         {
20             if(dp[i] != -1 && i + w2 < N)
21             {
22                 int temp = v2 + dp[i];
23                 t[w2+i] = temp > t[w2+i] ? temp : t[w2+i];
24             }
25         }
26     }
27     for(i = 0; i < N; i ++)
28         dp[i] = t[i] > dp[i] ? t[i] : dp[i];     
29 }
30 int main()
31 {
32     int total, num;
33     int i, j;
34     int w1, v1, w2, v2, t;
35     while(cin >> total >> num)
36     {
37         total /= 100;
38         N = total + 5;
39         memset(dp, -1, sizeof dp);
40         dp[0] = 0;
41         for(i = 0; i < num; i ++)
42         {
43             cin >> w1 >> v1 >> w2 >> v2 >> t;
44             w1 /= 100;
45             w2 /= 100;
46             if(t == 1)
47             {
48                 w1 += w2;
49                 v1 += v2;
50                 v2 = 0;
51             }
52             else if(t == 3)
53             {
54                 w2 += w1;
55                 v2 += v1;
56             } 
57             insertValue(w1, v1, w2, v2);
58         }
59         int max = -1;
60         for(i = 0; i <= total; i ++)
61             max = max > dp[i] ? max : dp[i];
62         cout << max << endl;
63     }
64     return 0;
65 }

转载于:https://www.cnblogs.com/xubin0523/archive/2012/05/01/2477838.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值