/*
背包问题之问法变化--求方案总数
给定每个物品的价值后求可得到的最大价值外,还可以得到
装满背包或者装至某一指定体积的方案总数.
具体操作就是将状态转移方程中的max改成sum.
例如0-1背包:dp[i][j]=sum(dp[i-1][j],dp[i-i][j-v[i]]);
初始化问题:dp[0][0]=1;
dp[N][V]就是用N件物品装满体积为V背包的方案数.
*/
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int N,V;
while(scanf("%d%d",&N,&V)&&(N||V))
{
int v[1000],w[1000],dp[1000];
memset(dp,0,sizeof(dp));
for(int i=1;i<=N;i++)
scanf("%d%d",&v[i],&w[i]);
dp[0]=1;
for(int i=1;i<=N;i++)
{
for(int j=v[i];j<=V;j++)
dp[j]=dp[j]+dp[j-v[i]];
}
for(int i=1;i<=V;i++)
printf("%d ",dp[i]);
printf("\n");
}
}
背包问题问法变化之---方案总数
最新推荐文章于 2023-03-26 23:43:52 发布