一本通-1291:数字组合(动态规划-硬币问题)¶
【题目描述】 有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
#include <bits/stdc++.h>
using namespace std;
int n, target;
vector<int> seq(25), d(1005);
int sum = 0;
int oneZeroPack()
{
if (target > sum) return 0;
d[0] = 1;
for (int i = 0; i < n; ++i) {
for (int j = target; j >= seq[i]; --j) {
d[j] += d[j - seq[i]];
}
}
return d[target];
}
int main()
{
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> target;
for (int i = 0; i < n; ++i) {
cin >> seq[i];
sum += seq[i];
}
cout << oneZeroPack() << endl;
return 0;
}
硬币问题或者背包问题,相似的题目是LeetCode 面试题 08.11. 硬币