描述
有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式。如:
n=5,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个正整数,用空格隔开。输出和为t的不同的组合方式的数目。
样例输入
5 5 1 2 3 4 5
样例输出
3
思路
可以开一个二维数组f[i][j],f[i][j]表示前i个数组合出来值为j有多少种情况
1 #include2 #include 3 using namespace std; 4 int f[30][1005]; 5 int a[30]; 6 int main() 7 { 8 int n,m; 9 scanf("%d%d",&n,&m); 10 for(int i=1;i<=n;i++) 11 { 12 scanf("%d",&a[i]); 13 f[i][a[i]]=1; 14 } 15 for(int i=1;i<=n;i++) 16 for(int j=1;j<=m;j++) 17 if(j>=a[i])f[i][j]+=f[i-1][j]+f[i-1][j-a[i]]; 18 else f[i][j]+=f[i-1][0]+f[i-1][j]; 19 printf("%d",f[n][m]); 20 return 0; 21 }