题目描述
有 n 个正整数,找出其中和为 t (正整数)的可能的组合方式。
如:n = 5, 5 个数分别为 1, 2, 3, 4, 5,t = 5;
那么可能的组合有 5 = 1 + 4 和 5 = 2 + 3 和 5 = 5 三种组合方式。
输入格式
输入的第一行是两个正整数 n 和 t,用空格隔开,分别表示正整数的个数与要求的和。
接下来的一行是 n 个正整数,用空格隔开。
输出格式
和为 t 的不同的组合方式的数目。
输入样例
5 5
1 2 3 4 5
输出样例
3
数据范围
1 ≤ n ≤ 20
1 ≤ t ≤ 1000
题解
01背包(空间优化):
#include <iostream>
using namespace std;
int n, m;
int v[30], f[1010];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++) cin >> v[i];
f[0] = 1;
for (int i = 1; i <= n; i ++)
for (int j = m; j >= v[i]; j --)
f[j] += f[j - v[i]];
cout << f[m] << endl;
return 0;
}