数字和为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 }

 

posted @ 2018-04-07 22:55  newmoonn  阅读(474)  评论(0编辑  收藏  举报