背包模板讲解
2017-07-19 00:44
176 查看
背包模板用一维数组去编写的,我是看《背包九讲》写出来的代码,实用性非常好!写《背包九讲》是个大神,看了部分就不由得崇拜这位大神了,讲得精简却又到位, 不少处还让读者自己去思考。有兴趣的可以到网上下载。
好吧,一波广告的时间结束,我就把代码敲出来吧,下面看代码吧,我只稍微注解一番了,主要是理解好二维到一维数组就能明白了。
#include <bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f #define maxn 10000 //定义一个结构体,主要是存储要放入背包里的物品 //cost放入背包时,物品要消耗的容积等 //weight物品的价值, amount这个参数只有 多重背包 才用到,是每种物品的数量 //也可以定义三个数组来搞定,不过感觉很麻烦 struct Pack { int cost; int weight; int amount; }a[maxn]; //f不用说了,就是状态转移函数,V是总消耗,即背包的容积 int f[maxn], V; //01背包的实现,我觉得叫它基础背包顺口点 void Basepack(int cost, int weight) { for(int v=V; v>=cost; v--) f[v] = max(f[v], f[v-cost]+weight); } //完全背包的实现 void Competepack(int cost, int weight) { for(int v=cost; v<=V; v++) f[v] = max(f[v], f[v-cost]+weight); } //多重背包的实现 void Multiplepack(int cost, int weight, int amount) { //发现当前这种物品的总价值超过了题给出的总价值V,那么就可以把这件物品的数量类似地看成是无限的,因为你取这种物品,可以取到比V还大的价值,而我们只要求取到V就行了 if(cost*amount >= V) { Competepack(cost, weight); return ; } //物品数目有限,转为01背包解决 //k使用到二进制思维,即取1,2,4,8...我是菜鸟详细讲解怕误人子弟,还是翻大佬博客吧 //k <<= 1 也就是 k = k*2 而k >>= 1是k /= 2 for(int k=1; k<amount; k<<=1) { Basepack(k*cost, k*weight); amount -= k; } Basepack(amount*cost, amount*weight); } int main() { int n; while(cin>>n) { for(int i=1; i<=n; i++) cin>>a[i].cost>>a[i].weight>>a[i].amount; //初始化比较复杂,要审题意初始化 //求最大值时候 memset(f, 0, sizeof(f)); //求最小值时候 memset(f, INF, sizeof(f)),然后f[0] = 0,有了最大自然要有个较小的值0嘛,思考思考。 //三种背包的实现 for(int i=1; i<=n; i++) Basepack(a[i].cost, a[i].weight); for(int i=1; i<=n; i++) Competepack(a[i].cost, a[i].weight); for(int i=1; i<=n; i++) Multiplepack(a[i].cost, a[i].weight, a[i].amount); } return 0; }
对模板再深入思考一番,看看基础背包与完全背包的函数代码,他们的状态转移公式都是价值的转移,我遇到过一个背包题,是用多重背包加上完全背包求最小硬币数,那么就f函数就定义为了求最小的硬币数,max 变为min,然后因为f[v-cost]加的weight是价值,就得变为硬币数,这里不多讲了,一般模板就这样差不多的样子了。
相关文章推荐
- Cash Machine POJ - 1276 (多重背包(模板))
- Splay tree讲解+模板
- 背包问题模板,POJ(1014)
- c++ 模板讲解
- 多重背包(模板)--hdoj2191
- WUST 1873 潜水员 (二维背包) 【模板】
- [模板练习]混合背包
- hdu 2844 Coins 多重背包模板题 ,二进制优化。据说是楼教主的男人八题之一
- HDU 2602 Bone Collector(0-1背包模板题)
- PHPCMS 整站代码分析讲解(六)之模板引擎
- 动态规划(2)-完全背包【模板】
- HDU - 2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包模板题)
- 1085 背包问题(0-1背包模板题)
- 【讲解 + 模板】四种最短路算法的比较
- hdu 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包模板题)
- 0 1背包模板
- 项目视频讲解_国内首部基于JBPM5.4实战流程引擎开发(动态表单、模板引擎、公文管理系统)
- 背包模板
- 背包模板(转)
- hrbust 哈理工 2252 完全背包模板题