您的位置:首页 > 其它

hdu 2639 Bone Collector II(01背包)(第k优解)

2015-12-24 01:29 531 查看

hdu 2639 Bone Collector II

分析

这是http://blog.csdn.net/pibaixinghei/article/details/50382013这道题的升级版,也就是在基础的01背包上增加了条件,问的是第k优解。原来的01背包,一维dp存的就是第一优解的状态,既然现在要第k优,则数组再增加一维,记录第k优的值,而且合并的时候也不能是简单的max(。。。) 而是应该分别记录dp[j][k]的值以及dp[j-vo[i]][k]的值,并由他们的大小进行合并,得到k个最优解,最后输出即可。

应该想到要增加一位,同时结合背包的原理,更新出k个解。

注意输入是先输所有价值,之后输所有重量。

问题

http://acm.hdu.edu.cn/showproblem.php?pid=2639

代码

#include <iostream>
#include <cstring>
#include <ctime>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <vector>

using namespace std;

long dp[10010][35];
long va[110],vo[110];
int a[35],b[35];

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(dp,0,sizeof(dp));
int N,V,K;
scanf("%d %d %d",&N,&V,&K);
for(int i=1; i<=N; i++)
scanf("%d",&va[i]);
for(int i=1; i<=N; i++)
scanf("%d",&vo[i]);

for(int i=1; i<=N; i++)
for(int j=V; j>=vo[i]; j--)
{
for(int k=0; k<=K; k++)
{
a[k]=dp[j][k];
b[k]=dp[j-vo[i]][k]+va[i];
}
a[K+1]=b[K+1]=-1;
int tt,ii,jj;
tt=ii=jj=1;
while(tt<=K&&(a[ii]!=-1||b[jj]!=-1))
{
if(a[ii]<b[jj])
dp[j][tt]=b[jj++];
else
dp[j][tt]=a[ii++];
if(dp[j][tt]!=dp[j][tt-1])
tt++;
}

}
cout<<dp[V][K]<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: