码迷,mamicode.com
首页 > 系统相关 > 详细

POJ 1276 Cash Machine

时间:2016-08-01 01:39:33      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:

POJ 1276 Cash Machine 水题

Description:给定物品数量n和目标价值k, 每种物品有ci个, 价值为vi, 求最后可得的不超过k的最大价值。、

裸得不能再裸的背包题。。

可以多重背包直接上也可以转化为完全背包QAQ。

唔。。这回为什么转移的时候判断不用判f[j]是否存在(即判定价值j是否可达)。。

因为本身就不用啊因为我蠢QAQ。

因为我们的状态定义的是目标为j时可达的最大价值, 不像上回有一道题是统计使用的物品个数的。上一道题需要判定是因为。每一个状态必须由上一个状态的钱币数转移过来, 上一个价值必须时可达的才能转移。

而这一回f数组里存的只是一个最大值。它可达不可达都一样啊价值还是0 + 当前val。对结果没有影响的。

反而。如果加了这么一个判定。

则可能会导致有些本来可以达到价值在f数组里更新不了。

sad。血淋淋的教训QAQ。以后无论写什么题都要先过过脑子。就像厉害的ljq(orzljq)说的一样不要先看自己会什么直接往上套, 而是先思考一下这道题应该用什么方法写会比较好。

渣代码:

技术分享
 1 #include <iostream>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <stdlib.h>
 6 #include <stdio.h>
 7 #define ll long long
 8 using namespace std;
 9 const int N = 100100;
10 int f[N], num[N];
11 struct qwq{ int val, num; } a[25];
12 int n, targ;
13 //bool yes[N];
14 int main()
15 {
16     while(~scanf("%d%d", &targ, &n)){
17         memset(f, 0, sizeof(f));
18         //memset(yes, 0, sizeof(yes));
19         for(int i = 1; i <= n; i ++){
20             int aa, bb;
21             scanf("%d%d", &aa, &bb);
22             if(!bb || !aa) { i --, n --; continue; }
23             a[i] = (qwq{ bb, aa });
24         }
25         if(!targ || !n) { puts("0");  continue; } 
26         //yes[0] = 1;
27         for(int i = 1; i <= n; i ++){
28             memset(num, 0, sizeof(num));
29             for(int j = a[i].val; j <= targ; j ++){
30                 if(f[j - a[i].val] + a[i].val > f[j] && num[j - a[i].val] + 1 <= a[i].num){
31                     f[j] = f[j - a[i].val] + a[i].val;
32                     num[j] = num[j - a[i].val] + 1;
33                     //yes[j] = 1;
34                 }
35             }
36         }
37         printf("%d\n", f[targ]);
38     }
39     return 0;
40 }
完全背包
技术分享
 1 #include <iostream>
 2 #include <string.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <stdlib.h>
 6 #include <stdio.h>
 7 #define ll long long
 8 using namespace std;
 9 const int N = 100100;
10 int f[N], num[N];
11 struct qwq{ int val, num; } a[25];
12 int n, targ;
13 void zeroone(int val) { for(int i = targ; i >= val; i --) if(f[i - val] + val > f[i]) f[i] = f[i - val] + val; }
14 void complete(int val) { for(int i = val; i <= targ; i ++) if(f[i - val] + val > f[i]) f[i] = f[i - val] + val; }
15 void multi(int val, int num)
16 {
17     if(num * val >= targ){
18         complete(val); return ;
19     }
20     int tmp = 1;
21     while(num > tmp){
22         zeroone(tmp * val);
23         num -= tmp;
24         tmp <<= 1;
25     }
26     if(num) zeroone(num * val);
27 }
28 int main()
29 {
30     while(~scanf("%d%d", &targ, &n)){
31         memset(f, 0, sizeof(f));
32         for(int i = 1; i <= n; i ++){
33             int aa, bb;
34             scanf("%d%d", &aa, &bb);
35             if(!bb || !aa) { i --, n --; continue; }
36             a[i] = (qwq{ bb, aa });
37         }
38         if(!targ || !n) { puts("0");  continue; } 
39         for(int i = 1; i <= n; i ++){
40             multi(a[i].val, a[i].num);
41         }
42         printf("%d\n", f[targ]);
43     }
44     return 0;
45 }
多重背包

NAILED IT ..

--------------------------

啊最近我的右眼视力急剧下降唔。。左眼又奇怪的远视sad。不要窝不想戴眼镜QAQ以后除了学习还是少盯着电脑和手机好惹Q!A!Q( 本来就应该如此 )

话说听说窝萌要换班主任了伐开心。。不知道新班主任肿么样。。不知道以后去机房请假的话会不会麻烦QAQ

 

POJ 1276 Cash Machine

标签:

原文地址:http://www.cnblogs.com/shadyqwq-juruo/p/5724347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!