给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。
当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。
输入描述:
输入为两行:
第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)
第二行为n个正整数Ai,以空格隔开。
输出描述:
输出所求的方案数
示例1
输入
5 15 5 5 10 2 3
输出
4
#include <iostream>
using namespace std;
const int N = 1010;
int dp[N][N];
int a[N];int main() {int n, k;cin >> n >> k;for (int i = 1; i <= n; i++)cin >> a[i];dp[0][0] = 1;for (int i = 1; i <= n; i++)for (int j = 0; j <= k; j++) {dp[i][j] = dp[i - 1][j];if (j >= a[i])dp[i][j] += dp[i - 1][j - a[i]];}cout << dp[n][k] << endl;return 0;
}
空间优化:
#include <iostream>
using namespace std;
const int N = 1010;
int dp[N];
int a[N];int main() {int n, k;cin >> n >> k;dp[0] = 1;for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= n; i++)for (int j = k; j >= a[i]; j--) {dp[j] += dp[j - a[i]];}cout << dp[k] << endl;return 0;
}