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 }
时间: 2024-08-10 19:16:25

01背包,完全背包,多重背包,混合背包的相关文章

背包(01,完全,多重,分组)

01背包 #include <cstdio> #include <iostream> using namespace std; int main() { int m,n,dp[100005]; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { int w,p; scanf("%d%d",&w,&p); for(int j=m;j>=w;j--) { dp[j]

蒟蒻吃药计划-治疗系列 #round4 多重背包+混合背包代码存放

1 #include <bits/stdc++.h> 2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i) 3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i) 4 using namespace std; 5 int v[1000+20],w[1000+20],s[1000+20]; 6 int dp[1000+20]; 7 int n,m; 8 inline int

混合背包(背包03)

将01背包,完全背包,和多重完全背包问题结合起来,那么就是混合三种背的问题 根据三种背包的思想,那么可以得到混合三种背包的问题可以这样子求解 for(int i=1; i<=N; ++i) if(第i件物品是01背包) zeroOnePack(c[i],w[i]); else if(第i件物品是完全背包) completePack(c[i],w[i]); else if(第i件物品是多重完全背包) multiplePack(c[i],w[i],n[i]); 这样能得到最优解的原因是,因为前一层已

模板——混合背包

http://codevs.cn/problem/3269/ 3269 混合背包 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond [题目描述]Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限 , 在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少? [输入描述] Input Description 第一行两个数N,V,下面N行每

ZOJ 3164 Cookie Choice 分组背包 混合背包

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3181 题意: 就是混合背包加分组背包,有的物品是01背包,有的是多重背包,有的是完全背包,同时物品还有不超过8组的分组,如果在同一组则最多只能选一种.问能不能恰好地用掉D的容量,并且使所获价值最大. 分析: 开始的想法是多开一个下标,先把没有分组的做了,在0的下标,然后分组分别在组号的下标里按顺序处理,是什么背包就用什么做法,不过一直WA,对拍小数据大数据都没啥问题(可能随机

HDU 3535 AreYouBusy (混合背包)

题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下,可以得到的最大的乐趣是多少,如果不能满足条件就输出-1 题解:二维01背包 dp[i][j]:前i组物品我们拥有j的价值时最大可获得的乐趣 0:我们需要先把dp[i]所有赋值为负无穷,这样就只能最少选一个才能改变负无穷 1:我们不需要:dp[i][j-ci]+gi(在此组中再选一个),这样就一定最

HDU-3591 混合背包

The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2277    Accepted Submission(s): 805 Problem Description In the country of ALPC , Xiaoqian is a very famous mathematician.

HDU 3535 分组混合背包

http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意:有n组工作,T时间,每个工作组中有m个工作,改组分类是s,s是0是组内至少要做一件,是1时最多做一件,2时随意,每项工作的描述是花费的时间和获得的快乐值,求在T时间内可获的最大快乐值. memset放错位置了,折腾老半天. 分组混合背包,有的取一件或不取,有的随意,有的最少一个 分三种情况讨论 s==0 考虑前面取过时这次取或不取,前一组取过时这次取或不取 s==1 考虑前一组取过时这次取或不取

01背包问题的学习(来源:背包九讲)

问题: 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 思路: 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放.用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}.这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的.所以有必要将它详细解释一下:"