01背包

这里就只放自己刷的题目了,毕竟是弱弱哒

HDU2546:饭卡

 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8         int n,m;
 9         while (~scanf("%d", &n), n)
10         {
11                 int f[2013] = {0}, menu[2013] = {0};
12                 for (int i = 1; i <= n; ++i){
13                         scanf("%d",&menu[i]);
14                 }
15 
16                 sort(menu + 1, menu + 1 + n);
17                 int tmp1 = menu[n];
18                 scanf("%d",&m);
19                 if (m < 5){
20                         printf("%d\n",m);
21                         continue;
22                 }
23                 m -= 5;
24 
25                 for (int i = 1; i < n; ++i){
26                         for (int v = m; v >= menu[i]; --v){
27                                 if (f[v] < f[v - menu[i]] + menu[i]){
28                                         f[v] = f[v - menu[i]] + menu[i];
29                                 }
30                         }
31                 }
32                 printf("%d\n",m + 5 - tmp1 - f[m]);
33         }
34 
35         return 0;
36 }
View Code

万恶的题目啊!第一道01背包的水题,然后因为sort中的"+ n + 1"写成了"+ n"让我debug了半个钟头有木有!!!!阿西吧!

 

HDU1171:Big Event in HDU

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 
 6 using namespace std;
 7 
 8 int value[5007] = {0}, dp[255555] = {0};
 9 
10 int main()
11 {
12         int n;
13         while (~scanf("%d",&n), n > 0)
14         {
15                 memset(value, 0, sizeof(value));
16                 memset(dp, 0, sizeof(dp));
17                 int step = 0, sum = 0;
18                 for (int i = 1; i <= n; ++i){
19                         int v,m;
20                         scanf("%d%d", &v, &m);
21                         sum += (v * m);
22                         while (m--){
23                                 value[++step] = v;
24                         }
25                 }
26                 int tmp = sum / 2;
27 
28                 for (int i = 1; i <= step; ++i){
29                         for (int j = tmp; j >= value[i]; --j){
30                                 dp[j] = max(dp[j], dp[j - value[i]] + value[i]);
31                         }
32                 }
33                 printf("%d %d\n",sum - dp[tmp], dp[tmp]);
34         }
35 
36         return 0;
37 }
View Code

2333,又是各种奇怪的姿势WA了,一开始dp数组没有开大,RE两发,接着判定结束应该是"n > 0" 写成了"n != -1"(=0就会无限下去辣),TLE了一发,然后就更加奇怪了"memset(value, 0, sizeof(value));"写成了"memset(value, 0, sizeof(int));",怒WA一发,然后就过了,真是愉快的小故事啊2333333,碎觉碎觉QAQ

 

HDU2602:Bone Collector

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 
 6 using namespace std;
 7 
 8 int volume[1007], value[1007] = {0}, dp[4007] = {0};
 9 
10 int main()
11 {
12         int T;
13         scanf("%d", &T);
14         while (T--)
15         {
16                 memset(value, 0, sizeof(value));
17                 memset(dp, 0, sizeof(dp));
18                 int n,v;
19                 scanf("%d%d",&n, &v);
20                 for (int i = 1; i <= n; ++i){
21                         scanf("%d", &value[i]);
22                 }
23                 for (int i = 1; i <= n; ++i){
24                         scanf("%d",&volume[i]);
25                 }
26 
27                 for (int i = 1; i <= n; ++i){
28                         for (int j = v; j >= volume[i]; --j){
29                                 dp[j] = max(dp[j], dp[j - volume[i]] + value[i]);
30                         }
31                 }
32                 printf("%d\n",dp[v]);
33         }
34 
35         return 0;
36 }
View Code

怒WA两发,逗比错误~

posted on 2016-04-05 22:14  comma_01  阅读(103)  评论(0)    收藏  举报

导航