对于给定了背包容量,物品费用,物品间的相互关系(分组,依赖)等
的背包问题,除了给定每个物品的价值后求得的最大价值外,还可以得到装满背包或将背包装置某一指定容量的方案总数
对于这类问题,一般只需要将状态转移方程中的max改成sum即可
如果\(j<=V_i\) 则第i件物品一件也放不进去,\(f_{[i,j]}=f_{[i-1,j]}\)
如果\(j>=V_i\) 则第i件物品能放进去一个,\(f_{[i,j]}=f_{[i-1,j]}+f_{[i,j-v[i]]}\),第i件物品一个都不放的情况下填满容量为j的背包的方案总数,加上第i件物品至少放一个的情况下填满容量为j的背包的方案总数
边界:\(f_{[0,i]}=0,f_{[0,0]}=1\)
目标:\(f_{[n,m]}\)
题目1
题目描述 Description
给出n枚邮票的面额,c1 c2 … cn,每枚邮票可以最多使用1次。试求出这n个不同面额的邮票最多能连续组成的最大面额是多大。例如1分,2分和3分的邮票,可以最多组成到1分到6分之间的所有面额,其它面额是无法组成的。
输入描述 Input Description
第一行,一个正整数n
第二行,n个空格隔开的正整数,c1 c2 c3 … cn
输出描述 Output Description
最大能连续组成的面额
样例输入 Sample Input
3
1 2 3
样例输出 Sample Output
6
数据范围及提示 Data Size & Hint
n<=30, ci <=100
定义:f[i]表示金额i是否可以组成
动态转移方程:\(f_j|=f_{j-v[i]}\)
ICtiger's Blog 求关注 $e^{ix}=cosx+isinx$