标签:
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
标签:
原文地址:http://www.cnblogs.com/shadyqwq-juruo/p/5724347.html