/*
背包问题问法变化--求次优解、K优解
实际上:一个正确的状态转移方程在求解的过程中遍历了所有的
可用策略,也就覆盖了问题的所有方案。只不过由于是
求最优解,把其他达不到最优策略的方案都给忽律了。
对于求次优解和第K优解的方法:
对于任两个状态的max运算等价于两个由大到小的有序队列的合并.
由该题明白了,状态方程求解的过程若的明白,背包问题就是不在话下.
*/
//Hud 2639 Bone Collector II
#include<stdio.h>
#include<memory.h>
#include<string.h>
int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int i,j,k,N,V,K,v[102],w[102],dp[1002][32],a[32],b[32];
scanf("%d%d%d",&N,&V,&K);
memset(dp,0,sizeof(dp));
for(i=1;i<=N;i++)
scanf("%d",&w[i]);
for(i=1;i<=N;i++)
scanf("%d",&v[i]);
for(i=1;i<=N;i++)
{
for(j=V;j>=v[i];j--)
{
for(k=1;k<=K;k++)
{
a[k]=dp[j][k];
b[k]=dp[j-v[i]][k]+w[i];
}
a[k]=-1,b[k]=-1;
int x=1,y=1,z=1;
while(z<=K&&(x<=K||y<=K))
{
if(a[x]>b[y]) {dp[j][z]=a[x];x++;}
else {dp[j][z]=b[y];y++;}
if(dp[j][z]!=dp[j][z-1]) z++;
}
}
}
printf("%d\n",dp[V][K]);
}
}
背包问题问法变化之---求次优解、k优解[以hud Bone Collector II 为例]
最新推荐文章于 2022-07-17 15:35:37 发布