hyxzc_背包九讲课件
10
1 1 1 5 5 7 9 //体积
5 5 1 5 3 5 1//价值
01
完全
多重
分组
有依赖性
...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
01背包
vi ci
if (i+vi)
n 为物品数,m为背包容量
f[i][j]//表示在体积为j的情况下,装前i个物品时的最大价值。
那么在f[i-1][j]//取前i-1个物品的最大价值上考虑是否能放下第i的物品。
对于每一个物品,我们有两种选择,①是取,f[i][j]=f[i-1][j-v[i]]+c[i],②是不取
f[i][j]=f[i-1][j],
综上所述,f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+c[i]);
for (int i=1;i<=n;i++)
f[n][m]即为最优解。
优化 :① 用滚动数组来求。
for (int i=1,i<=n;i++)
http://codevs.cn/problem/1068/
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
完全背包
vi ci
与01背包最大的区别 对于每一个物品来说,可以选无数次。
解答上次思考:
也就是 完全背包。
同样 优化也有两种
http://acm.nyist.net/JudgeOnline/problem.php?pid=311
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
多重背包
也就是说限定物品选择的个数。
vi ci ki //对于第i个物品,体积为vi,价值ci,只能选择ki次。
① 将 ki 分为 ki 个物品,然后用01背包解决。
② 采用类似lca的方法,将k个物品分为 1,2,4,8,16,..... 2^n.
http://codevs.cn/problem/3269/
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
分组背包
http://acm.hdu.edu.cn/showproblem.php?pid=1712
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
有依赖性背包
直接上例题
http://codevs.cn/problem/1155/
预处理分组,然后上分组背包。
说实话,这种题不难,但预处理很恶心。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
背包问题的扩展
上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置。
编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小。
对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0。
输入格式:
输入文件的第一行是一个正整数n(1≤n≤1000),表示多米诺骨牌数。接下来的n行表示n个多米诺骨牌的点数。每行有两个用空格隔开的正整数,表示多米诺骨牌上下方块中的点数a和b,且1≤a,b≤6。
输出格式:
输出文件仅一行,包含一个整数。表示求得的最小旋转次数。
题解 :
--------------------------------------------------------------------------------------------------------------------------------------------------------------------