hihocoder_week195奖券兑换

题目链接: http://hihocoder.com/contest/hiho195/problem/1

解题思路: 记一下背包问题的模板。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int imax_n = 100005;
 5 int n, m;
 6 int f[imax_n];
 7 int w[imax_n], p[imax_n];
 8 map<int, int> mp;
 9 
10 void zeroOneBag(int weight, int value)
11 {
12     for (int j = m; j >= weight; --j)
13     {
14         f[j] = max(f[j], f[j-weight] + value);
15     }
16 }
17 
18 void completeBag(int weight, int value)
19 {
20     for (int j = weight; j <= m; ++j)
21     {
22         f[j] = max(f[j], f[j - weight] + value);
23     }
24 }
25 
26 void multiBag(int weight, int value, int z)
27 {
28     int k = z;
29     int b = 1;
30     if (k * weight >= m)
31     {
32         completeBag(weight, value);
33         return ;
34     }
35     while (k >= b)
36     {
37         zeroOneBag(b*weight, b*value);
38         k -= b;
39         b<<=1;
40 
41     }
42     if (k)
43         zeroOneBag(k*weight, k*value);
44 }
45 
46 int main()
47 {
48     scanf("%d%d", &n, &m);
49     for (int i = 0; i < n; ++i)
50     {
51         scanf("%d%d", &w[i], &p[i]);
52         mp[100 * w[i] + p[i]]++;
53     }
54     int ans = 0;
55     memset(f, 0, sizeof(f));
56     for (int i = 1; i <=10; ++i)
57     {
58         for (int j = 1; j <=10; ++j)
59         {
60             if (mp.find(i * 100 + j) == mp.end())
61             {
62                 continue;
63             }
64             else
65             {
66                 multiBag(i, j, mp[i * 100 + j]);
67             }
68         }
69     }
70     for (int i = 0; i <= m; ++i)
71     {
72         ans = max(ans, f[i]);
73     }
74     printf("%d\n", ans);
75     return 0;
76 }

 

posted @ 2018-04-18 21:58  只会一点暴力  阅读(208)  评论(0编辑  收藏  举报