

代码实现:
递归实现
#include<iostream>
using namespace std;
int a[30];
int N;
int Ways(int w, int k)
{//从前k种物品中选择一些,凑成体积w的做法物品
if (w == 0)
return 1;//w=0,一个都不选,只有一种选法
if (k <= 0)
return 0;//没有选择方法
return Ways(w, k - 1) + Ways(w - a[k], k - 1);//不选第k种物品的选法+选了第k种物品的选法
}
int main()
{
cin >> N;
for (int i = 1; i <= N; i++)
cin >> a[i];
cout << Ways(40, N);
return 0;
}
动规解法:
#include<iostream>
using namespace std;
int a[30];
int N;
int Ways[40][30];//Ways[i][j]表示从前j种物品里凑出体积i的方法数