动态规划
创建数组f[n + 1][sum + 1],f[i][j]表示前i个数中和为j的方案数。当a[i - 1] ≤ j时,f[i][j] = f[i - 1][j] + f[i - 1][j - a[i - 1]],当a[i - 1] > j时,f[i][j] = f[i - 1][j]。其中f[0][j] = 0,f[i][0] = 1。
#include <iostream>
using namespace std;
int main(void)
{
int n, sum;
cin >> n >> sum;
int* a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
int** f = new int* [n + 1]; //f[i][j]表示前i个数中和为j的方案数
for (int i = 0; i <= n; i++)
{
f[i] = new int[sum + 1];
}
int i, j;
for (i = 0, j = 0; j <= sum; j++)
f[i][j] = 0;
for (i = 0, j = 0; i <= n; i++)
f[i][j] = 1;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= sum; j++)
{
if (a[i - 1] <= j)
f[i][j] = f[i - 1][j] + f[i - 1][j - a[i - 1]];
else
f[i][j] = f[i - 1][j];
}
}
cout << f[n][sum] << endl;
return 0;
}
运行结果: