本文为大型题解集
X1291 数字组合
X1273 【例9.17】货币系统
P1077 摆花
X1291 数字组合
01背包求方案数。here
初探
定义状态:表示前个数总和为的方案数。
那么,对于一个物品,只有选与不选两种情况(当然费用比承重大一定不选)。
易得状态转移方程:
即,前个数总和为的方案数与前个数有关。前个数总和为的方案数为前个数总和为的方案数与前个数总和为的方案数之和。即不入选这个数字与入选这个数字的方案数之和,加法原理。
初始化:前个数总和为的方案数为一(只有什么也不选)。
CODE:
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
{
if(a[i]<=j)
f[i][j]+=f[i-1][j-w[i]];
f[i][j]+=f[i-1][j];
}
时间复杂度与空间复杂度皆为。
优化
前个数总和为的方案数与前个数有关。
因此,可以对此优化,直接滚动成一维,把的那一维消掉。
CODE:
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=m;j>=w[i];j--)
f[j]+=f[j-w[i]];
空间复杂度降为。
注意,内层循环要逆序。这和01背包的逆序原因类似。
X1273 【例9.17】货币系统
完全背包求方案数。here
与完全背包类似,内层循环改为正序即可。这和完全背包的正序原因类似。
CODE:
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=w[i];j<=m;j++)
f[j]+=f[j-w[i]];
P1077 摆花
这是个分组背包!为什么呢?
为了在门口展出更多种花,规定第种花不能超过盆,摆花时同一种花放在一起。
第种花可以放不超过盆的任意盆。相当于第组花有许多捆在一起的花,标号至。第号有盆花捆着。每组中的花只能选一个。
f[0]=1;
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
for(int k=1;k<=a[i];k++)//标号1至a_i
if(j>=k)
f[j]+=f[j-k];//第j号有j盆花捆着
本文作者:Yurchiu
本文链接:https://yz-hs.github.io/dd819f9a09a1/
版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。