数字和为sum的方法数
题目描述
给定一个有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
题解:
1.暴力 1000^1000 TLE
2.dp
1 #include<iostream> 2 #include<cstdio> 3 4 const int N = 1000+5; 5 using namespace std; 6 long long dp[N][N]; 7 8 int main(){ 9 int n,sum; 10 long long a[N]; 11 scanf("%d%d",&n,&sum); 12 for(int i = 1;i<=n;i++){ 13 scanf("%lld",&a[i]); 14 } 15 for(int i = 1;i<=sum;i++) 16 dp[0][i]=0; 17 dp[0][0]=1; 18 for(int i = 1;i<=n;i++){ 19 for(int j = 0;j<=sum;j++){ 20 if(j>=a[i]) 21 dp[i][j]=dp[i-1][j-a[i]]+dp[i-1][j]; 22 else 23 dp[i][j]=dp[i-1][j]; 24 } 25 } 26 printf("%lld\n",dp[n][sum]); 27 return 0; 28 }
Stay Hungry Stay Foolish.