hdu2639(01背包的第K大)

来源:互联网 发布:知乎a tender feeling 编辑:程序博客网 时间:2024/05/21 14:00

链接:点击打开链接

题意:求01背包的第K大值

代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;int v[105],w[105],dp[1005][35],tmp[2005];int main(){    int N,K,V,i,j,k,t,l,cnt;    scanf("%d",&t);    while(t--){                                 //dp[i][j]代表容量是i第j大        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--){                cnt=0;                for(k=1;k<=K;k++){                    tmp[cnt++]=dp[j-v[i]][k]+w[i];                    tmp[cnt++]=dp[j][k];                }                               //把所有情况存起来                sort(tmp,tmp+cnt,greater<int>());                l=unique(tmp,tmp+cnt)-tmp;                for(k=1;k<=min(l,K);k++)        //去重排序赋值                dp[j][k]=tmp[k-1];            }        }        printf("%d\n",dp[V][K]);    }    return 0;}

0 0
原创粉丝点击