题目描述
给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
输入描述:
输入为两行:
第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)
第二行为n个正整数A[i](32位整数),以空格隔开。
输出描述:
输出所求的方案数
示例1
输入
5 15
5 5 10 2 3
输出
4
分析
可以用动态规划来做。n为输入的数字个数,num[]表示输入的数,sum表示要凑成的数。
sum加到了1000,则建一个1002*1002的二维数组。行实际用了n行(有n个输入值),列实际用了sum列。dp[i][j]表示前i个数字凑到数j时,最多有多少种方案。它等于用了第i行代表的数时的方案数与没用第i行代表的数时的方案数之和。当当没用时,方案数为dp[i-1][j],即前一个的方案数。当用了时,方案数为dp[i-1][j-第i个数](实际上是dp[i-1][j-num[i-1]]),即前i-1个数只需要凑到j-num[i-1]时的方案数。
这时需要考虑的是初始化问题。首先dp的每一个数,都应该是0;然后,dp[0][j]=0,表示不用num里的数字时,有0种方案凑成数j;再次,dp[0][0]=1,表示什么都不用时&