解析:
1.h==0 是不能卡bug的,所以就是简单的0/1背包
2.h!=0,我们要枚举(1~n)中的每个装备是因为卡bug放进去的,那么除去这个卡bug装备剩下的一定又是一个0/1背包,最大体积为m+h-1 。
每枚举一件卡bug装备,就要跑一个0/1背包,还要初始化f数组。
每次跑完0/1背包的最大值还要加上这个卡bug装备的威力值
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
int w[N],v[N];
int f[N];
int n,m,h;
int main()
{
while(~scanf("%d",&n)&&n!=0)
{
scanf("%d %d",&m,&h);
memset(f,0,sizeof f);
for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
if(h==0)
{
for(int i=1;i<=n;i++)
{
for(int j=m;j>=v[i];j--)
{
f[j]=max(f[j-v[i]]+w[i],f[j]);
}
}
cout<<f[m]<<endl;
}
else
{
m=m+h-1;
int ans=0;
for(int i=1;i<=n;i++)
{
memset(f,0,sizeof f);
for(int j=1;j<=n;j++)
{
if(i==j) continue;
for(int k=m;k>=v[j];k--)
{
f[k]=max(f[k],f[k-v[j]]+w[j]);
}
}
ans=max(ans,f[m]+w[i]);
}
cout<<ans<<endl;
}
}
}