在N个数中找出其和为M的若干个数。先读入正整数N(1<N<100)和M(1<M<10000), 再读入N个正数(可以有相同的数字,每个数字均在1000以内), 在这N个数中找出若干个数, 使它们的和是M, 把满足条件的数字组合都找出来以统计组合的个数,输出组合的个数(不考虑组合是否相同)。要求你的程序运行时间不超过1秒。 | |||
输入格式 Input Format | |||
第一行是两个数字,表示N和M。 第二行起是N个数。 | |||
输出格式 Output Format | |||
就一个数字,表示和为M的组合的个数。 | |||
样例输入 Sample Input [复制数据] | |||
样例输出 Sample Output [复制数据] | |||
|
|
| |
| 时间限制 Time Limitation |
| |
| 各个测试点1s | ||
|
//d[j]=d[j]+d[j-a[i]],当j=0时,就是不装,所以 d[0]=1;
#include <iostream>
#include <cstring>
using namespace std;
int a[105],d[10005];
int main()
{
int n,m,i,j;
while(cin>>n>>m)
{
for(i=1;i<=n;i++) cin>>a[i];
memset(d,0,sizeof(d));
d[0]=1;
for(i=1;i<=n;i++)
for(j=m;j>=a[i];j--)
d[j]=d[j]+d[j-a[i]];
cout<<d[m]<<endl;
}
return 0;
}