小蒜有 n(1≤n≤20) 个正整数,找出其中和为 (t 也是正整数)的可能的组合方式。如:n=5 个数分别为 1,2,3,4,5 t=5;
那么可能的组合有 5=1+4 和 5=2+3 和 5=5 三种组合方式。
输入格式
输入的第一行是两个正整数 n 和 t,用空格隔开,其中1≤n≤20, 表示正整数的个数,t 为要求的和 (1≤t≤1000)
接下来的一行是 n 个正整数,用空格隔开。
输出格式
和为 tt 的不同的组合方式的数目。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
5 5
1 2 3 4 5
样例输出
3
dp[i][j]表示前i个数等于j的个数
#include<bits/stdc++.h>
using namespace std;
const int MAXN=30;
const int INF=1001;
int main(){
int dp[MAXN][INF];
memset(dp,0,sizeof(dp));
int num[MAXN];
int n,t;
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
dp[i][num[i]]++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=num[i];j++){
dp[i][j]+=dp[i-1][j];
}
for(int j=num[i]+1;j<=t;j++){
dp[i][j]=dp[i-1][j]+dp[i-1][j-num[i]];
}
}
printf("%d",dp[n][t]);
}