动态规划之背包模版

详见大牛背包九讲(下载地址: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
",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*k);
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 }
原文地址:https://www.cnblogs.com/qq188380780/p/6409474.html