题目描述
给定一个有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
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,count,a[1001];
cin>>n>>count;
long long int dp[n+1][count+1];//注意范围
for(int j=0;j<=count+1;j++)
dp[0][j]=0;
dp[0][0]=1;//辅助作用,方便数组的原始第一次计数
//cout<<dp[n][count]<<endl;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
for(int j=0;j<=count;j++)
{
if(j<a[i])
dp[i][j]=dp[i-1][j];//计数。。。a[i][0]都为一
else
dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]];//个数为上一个循环到这个数字个数加本次J减去本次出现的数字所得的数字的个数
}
}
//此处为方案集合,有兴趣的可以看看,可以方便理解每一步怎么计算的
//cout<<dp[0][15]<<endl;
/*for(int i=1;i<=n;i++)
{
cout<<a[i]<<":";
for(int j=0;j<=count;j++)
{
cout<<dp[i][j]<<" ";
}
cout<<endl;
}*/
cout<<dp[n][count];
return 0;
}