01背包 第k优解

来源:互联网 发布:c语言静态局部变量 编辑:程序博客网 时间:2024/04/29 02:57

求次优解、第K 优解

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;struct Node{    int price;    int val;} node[1005];int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n,v,k,i,dp[1005][31] = {0},a[31],b[31];        scanf("%d%d%d",&n,&v,&k);        for(i = 0; i<n; i++)            scanf("%d",&node[i].price);        for(i = 0; i<n; i++)            scanf("%d",&node[i].val);        int j;        for(i = 0; i<n; i++)        {            for(j = v; j>=node[i].val; j--)            {                int cnt = 0,d;                for(d = 1; d<=k; d++)//分别将放入第i个石头与不放第i个石头的结果存入a,b,数组之中                {                    a[d] = dp[j-node[i].val][d]+node[i].price;                    b[d] = dp[j][d];                }                int x,y,z;                x = y = z = 1;                a[d] = b[d] = -1;                while(z<=k && (x<=k || y<=k))//循环找出前K个的最优解                {                    if(a[x] > b[y])                    {                        dp[j][z] = a[x];                        x++;                    }                    else                    {                        dp[j][z] = b[y];                        y++;                    }                    if(dp[j][z]!=dp[j][z-1])                    z++;                }            }        }        printf("%d\n",dp[v][k]);    }    return 0;}


0 0
原创粉丝点击