链接:https://www.nowcoder.com/questionTerminal/7f24eb7266ce4b0792ce8721d6259800
来源:牛客网
给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
输入描述:
输入为两行:
第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)
第二行为n个正整数A[i](32位整数),以空格隔开。
输出描述:
输出所求的方案数
输入例子:
5 15
5 5 10 2 3
输出例子:
4
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
long long dp(int m,vector<int> &c){
vector<long long> nums(m+1,0);
for(int i:c){
if (i>m)
continue;
for(int j = m;j>=1;j--){
if(nums[j]>0&&j+i<=m)
nums[j+i] += nums[j];
}
nums[i]++;
}
return nums[m];
}
int main(){
int n,sum;
cin>>n>>sum;
vector<int> candidates(n,0);
for(int i = 0;i<n;i++){
scanf("%d",&candidates[i]);
}
cout<<dp(sum,candidates);
}
建立一个长度为sum的数组,数组表示当前这个数有多少种组合方式。
对输入的每个元素i,若i<=sum,则:
* 数组[i]++
* 对数组的所有元素,数组[j+i]+=数组[j](因为更新是同时进行的,为防止标号小的对大的产生影响,要从大往小更新。 )
不断更新。