(个人水平有限,请见谅!)
题目描述:
给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
输入描述:
第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)。
第二行为n个正整数Ai(32位整数),以空格隔开。
输出描述:
输出所求的方案数。
输入:
5 15 5 5 10 2 3
输出:
4
代码示例1:(递归)
// 仅通过40%测试样例
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int sum = 0;
int getAnswer(vector <int> &array, int m, int k)
{
for (int i = k; i < array.size(); i++)
{
if (m-array[i] == 0)
return 1;
else if (m-array[i] > 0)
sum += getAnswer(array, m-array[i], i+1);
else
break;
}
return 0;
}
int main()
{
int n, m, temp;
cin >> n >> m;
vector <int> array;
while (cin >> temp)
array.push_back(temp);
sort(array.begin(), array.end());
getAnswer(array, m, 0);
cout << sum;
}
代码示例2:(动态规划)
#include <iostream>;
#include <vector>
using namespace std;
int main()
{
int n, sum;
cin >> n >> sum;
vector <long long> dp(sum+1, 0), p(n+1, 0);
dp[0] = 1;
for (int i = 1; i < n+1; i++)
cin >> p[i];
for (int i = 1; i < n+1; i++)
for (int j = sum; j >= 0; j--)
if (p[i] <= j)
dp[j] = dp[j] + dp[j-p[i]];
cout << dp[sum];
}