其实求背包的方案数和求最大价值相差不大,最大的区别就是状态转移方程。
直接上核心代码:
d[0]=1;//这个很重要,不能少!
d[j]=d[j]+d[j-w[i]];
众所周知,j就是背包剩余的容量,当我把背包通过不断装东西后(j-w[i])装满后,j就是0,也就意味着多了一种方案数。
上全部代码:
//完全
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long n,v,w[100010],d[100010];
cin>>n>>v;
d[0]=1;
for(int i=1;i<=n;i++)
{
cin>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=v;j++)
{
if(j>=w[i])
{
d[j]=d[j]+d[j-w[i]];
}
}
}
cout<<d[v];
return 0;
}
//01
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
long long n,v,w[100010],d[100010];
cin>>n>>v;
d[0]=1;
for(int i=1;i<=n;i++)
{
cin>>w[i];
}
for(int i=1;i<=n;i++)
{
for(int j=v;j>=0;j--)
{
if(j>=w[i])
{
d[j]=d[j]+d[j-w[i]];
}
}
}
cout<<d[v];
return 0;
}
希望别限流了!