描述
给定N个正整数A1,A2,…,AN,从中选出若干个数,使它们的和为M,求有多少种选择方案。
注意:选择不同位置的,但值相同的数,认为是不同的方案。
比如:有3个数1 1 1,要组合出2,那么有3个方案,分别是选第1、2个数,选第1、3个数,选第2、3个数。
输入描述
第一行包含两个整数N和M。
第二行包含N个整数,表示A1,A2,…,AN。
输出描述
包含一个整数,表示可选方案数(本题的计算结果一定在int范围内)。
用例输入 1
4 4 1 1 2 2
用例输出 1
3
提示
【数据范围】
1≤N≤100,
1≤M≤10000,
1≤Ai≤1000
来源
动态规划 背包问题
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 7;
int dp[maxn],a[maxn];//The value when the sum it i.
int main()
{
int n,m;
cin>>n>>m;
for(int i = 1;i <= n;i++)
{
cin>>a[i];
}
dp[0] = 1;
for(int i = 1;i <= n;i++)
{
for(int j = m;j >= a[i];j--)
{
dp[j] += dp[j - a[i]];
}
}
printf("%d\n",dp[m]);
return 0;
}