比较简单的模板
概括起来就是f[j]=f[j]+f[j-a[i]]
即当放入第i件物品时
放入后会满的背包空间需要再加上不放入时的方案数
01背包
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,i,j,a[105];
long long f[11000];
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
f[0]=1;
for(i=1;i<=n;i++)
for(j=m;j>=a[i];j--)
f[j]=f[j]+f[j-a[i]];
printf("%lld",f[m]);
return 0;
}
完全背包
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,i,j,a[105];
long long f[11000];
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
f[0]=1;
for(i=1;i<=n;i++)
for(j=a[i];j<=m;j++)
f[j]=f[j]+f[j-a[i]];
printf("%lld",f[m]);
return 0;
}