给定N个正整数A1,A2,…,AN,从中选出若干个数,使它们的和为M,求有多少种选择方案。
输入格式
第一行包含两个整数N和M。
第二行包含N个整数,表示A1,A2,…,AN。
输出格式
包含一个整数,表示可选方案数。
数据范围
1≤N≤100,
1≤M≤10000,
1≤Ai≤1000
输入样例:
4 4
1 1 2 2
输出样例:
3
思路:
这个问题可以转化为:从n件物品(数字)中选若干个,使之和恰好为为m的方案个数,每个数都是只有选和不选两种决策,显然可以把这个问题看作一个01背包求方案数的问题,从状态表示和状态计算两方面分别分析:
状态表示:集合:用f[i,j]表示选前i个物品,且体积恰好为j的方案,维护的属性为count(个数)。
状态计算等价于集合划分的过程,将f[i,j]按照最后一个物品(当前的i)选和不选,可以划分为两块,一块为选第i件,另一块为不选第i件。
不选第i件:f[i,j]=f[i-1,j]
选第i件:f[i,j]=f[i-1,j-vi](vi表示当前第i个数的数值,选第i件之后会有两部分构成,因为是求方案数,因此两部分是一个方案,方案数等价,所以只分析去掉地i件的前一部分的方案数即可)
因此,最后f[i,j]=f[i-1,j]+f[i-1,j-vi],可以发现转态转移中当