详见大牛背包九讲(下载地址: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 }
时间: 2024-08-10 19:16:25