现在的位置: 首页 > 综合 > 正文

hdu 2639

2018年12月28日 ⁄ 综合 ⁄ 共 629字 ⁄ 字号 评论关闭

第K大背包问题

现在01的基础上多加一维,dp[v][k],表示在v下第k大的价值。。。

用A[ ],B[ ];分别记录加入第i件物品的前k个最大价值,不加入第i件物品的前k个最大价值

取两个数组的前k大值

也可以用一个数组存,再排序,找前k项

 

 

 

 

 

#include<stdio.h>
#include<string.h>
int dp[1010][40];
int main()
{
	int i,m,n,V[110],W[110],j,k,A[40],B[40],t,a,b,c,v;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&n,&v,&k);
		for(i=0;i<n;i++)
			scanf("%d",&W[i]);
		for(i=0;i<n;i++)
			scanf("%d",&V[i]);
		memset(dp,0,sizeof(dp));
		for(i=0;i<n;i++)
			for(j=v;j>=V[i];j--)
			{
				for(m=1;m<=k;m++)
				{
					A[m]=dp[j-V[i]][m]+W[i];
					B[m]=dp[j][m];
					
				}
				A[m]=B[m]=-1;
				a=b=c=1;
				while(c<=k&&(a!=m||b!=m))
				{
					if(A[a]>B[b])
						dp[j][c]=A[a++];
					else dp[j][c]=B[b++];
					if(dp[j][c]!=dp[j][c-1])
						c++;
				}
			}
			printf("%d\n",dp[v][k]);
	}
	return 0;
}

 

抱歉!评论已关闭.