标签:des style blog class code c
这是一个典型的求第k优解的问题。。背包九讲上面都有。。。所有我只讲一下我的思路。。求第k优解就是在最优解的复杂度上增加了一个k,每次用一个物品去更新dp[v]的时候用一个数组保存才来。。然后排序,题目说要去重,那就很好办了。。然后经过N个物品的更新,那么最后的答案就是打dp[V][K]..
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2639
题目为:
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2037 Accepted Submission(s): 1058
3 5 10 2 1 2 3 4 5 5 4 3 2 1 5 10 12 1 2 3 4 5 5 4 3 2 1 5 10 16 1 2 3 4 5 5 4 3 2 1
12 2 0
代码为:
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[1005][40],cost[105],value[105],ans[10000];
int N,V,K;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int t,i,j,cnt,pos,k;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d%d",&N,&V,&K);
for(i=1;i<=N;i++)
scanf("%d",&value[i]);
for(i=1;i<=N;i++)
scanf("%d",&cost[i]);
for(i=1;i<=N;i++)
for(j=V;j>=cost[i];j--)
{
cnt=1;
for(k=1;k<=K;k++)
{
ans[cnt++]=dp[j][k];
ans[cnt++]=dp[j-cost[i]][k]+value[i];
}
sort(ans+1,ans+cnt,cmp);
int x=1;
for(k=1;k<cnt-1;k++)
{
if(x>K)
break;
if(ans[k]!=ans[k+1])
dp[j][x++]=ans[k];
}
}
printf("%d\n",dp[V][K]);
}
return 0;
}
标签:des style blog class code c
原文地址:http://blog.csdn.net/u014303647/article/details/25960325