二刷提高课,题解目录在这里— 提高课的题解目录
猛一看好像是个数学问题,其实并不是
我们可以观察到这N个数所取是要么取要么不取
这就演变成了,给定n个物品,从中选取多个且恰好使用了M容量的方案数
所以这里是个01背包问题
注意初始化为1,因为当M为零时,无论多少个数均不选所以只有一种方案数
#include<iostream>
using namespace std;
int a[110],f[110][10010];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i],f[i][0]=1;
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
f[i][j]=f[i-1][j];
if(j>=a[i])f[i][j]+=f[i-1][j-a[i]];
}
cout<<f[n][m];
}