hdu2639

/*
分析:
    第K背包就是0-1背包变异,把dp开成三维的,第三个
维度记录最大的K个值,就行了。
    至于递推过程,和0-1是一样的,不用担心会漏掉情况
哦~,想想就出来了0.0


                                            2012-07-10
*/






#include"stdio.h"
#include"string.h"
struct A
{
	int val;
	int v;
}E[111];


int main()
{
	int T;
	int N,V,K;
	int i,l,j;
	int dp[1111][33];
	int temp;
	int A[33],B[33];
	int a,b,c;
	int f1,f2;


	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d",&N,&V,&K);
		for(i=1;i<=N;i++)	scanf("%d",&E[i].val);
		for(i=1;i<=N;i++)	scanf("%d",&E[i].v);


		memset(dp,0,sizeof(dp));
		for(i=1;i<=N;i++)
		{
			for(l=V;l>=E[i].v;l--)
			{
				temp=l-E[i].v;
				for(j=1;j<=K;j++)
				{
					A[j]=dp[temp][j]+E[i].val;
					B[j]=dp[l][j];
					if(A[j]==E[i].val)	break;
				}
				for(j++;j<=K;j++)
				{
					A[j]=0;
					B[j]=dp[l][j];
				}
				a=b=c=1;
				f1=f2=0;
				while(c<=K)
				{
					if(A[a]>B[b])	{dp[l][c]=A[a];a++;}
					else			{dp[l][c]=B[b];b++;}
					if(dp[l][c]==0)	break;
					if(dp[l][c]!=dp[l][c-1])	c++;
				}
				while(c<=K)	dp[l][c++]=0;
			}
		}


		printf("%d\n",dp[V][K]);
	}


	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值