01背包,完全背包,多重背包,混合背包
Posted Jeson
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01背包,完全背包,多重背包,混合背包相关的知识,希望对你有一定的参考价值。
详见大牛背包九讲(下载地址:http://pan.baidu.com/s/1b9edXW)
1 //Class->物品种类,val->价值,room->所占空间,num->物品数量,Room->背包容量
2
3 #include<stdio.h>
4 const int maxn = 1e6;
5
6 int bag[maxn];
7 int Room;
8
9 void zero_one_bag(int,int); //01背包
10 void complete_bag(int,int); //完全背包
11 void multiple_bag(int,int,int); //多重背包(二进制优化)
12 void blendede_bag(int,int,int); //混合背包
13
14 int main()
15 {
16 int Class,val,room,num;
17 while(~scanf("%d%d",&Class,&Room))
18 {
19 /*while(Class--)
20 {
21 scanf("%d%d",&val,&room);
22 //zero_one_bag(val,room);
23 //complete_bag(val,room);
24 }
25 while(Class--)
26 {
27 scanf("%d%d%d",&val,&room,&num);
28 //multiple_bag(val,room,num);
29 blendede_bag(val,room,num);
30 }*/
31 printf("%d\n",bag[Room]);
32 }
33 }
34
35 void zero_one_bag(int val,int room)
36 {
37 for(int i=Room; i>=room; --i)
38 {
39 int temp = bag[i-room] + val;
40 if(bag[i] < temp)
41 bag[i]=temp;
42 }
43 }
44
45 void complete_bag(int val,int room)
46 {
47 for(int i=room; i<=Room; ++i)
48 {
49 int temp = bag[i-room] + val;
50 if(bag[i] < temp)
51 bag[i]=temp;
52 }
53 }
54
55 void multiple_bag(int val,int room,int num)
56 {
57 if(room * num >= Room)//该物品所占总体积大于等于背包容量,相当于完全背包
58 {
59 complete_bag(val,room);
60 return ;
61 }
62
63 for(int k=1; k<num; k*=2)//该物品所占总体积小于背包容量,二进制优化后相当于01背包
64 {
65 zero_one_bag(val*k,room);
66 num-=k;
67 }
68 zero_one_bag(val*num,room*num);
69 }
70
71 void blendede_bag(int val,int room,int num)
72 {
73 if(room * num >= Room)//该物品所占总体积大于等于背包容量,相当于完全背包
74 {
75 complete_bag(val,room);
76 return ;
77 }
78 else if(num == 1)//该物品数量为1,相当于01背包
79 zero_one_bag(val,room);
80 else
81 multiple_bag(val,room,num);//数量不为1,相当于多重背包
82 }
以上是关于01背包,完全背包,多重背包,混合背包的主要内容,如果未能解决你的问题,请参考以下文章