zoukankan      html  css  js  c++  java
  • HDU 2639 Bone Collector II (DP 第k优解)

    题意:输入t,t组测试样例,每组样例输入 n, v, k. 接着输入n个物品的价值,再输入n个物品的体积。求k优解。

    分析:dp[n][v][k]表示n个物品,在体积不超过v的情况,第k大的值是多少。dp[i][v][k]与dp[i-1][v][k]与dp[i-1][v-volume[i]]+value[i]有关。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    const int maxn = 105;
    
    int value[maxn];
    int volume[maxn];
    int dp[maxn*10][50];
    int a[50];
    
    bool cmp(int x1, int x2)
    {
        return x1>x2;
    }
    
    int main()
    {
        int n, v, k;
        int t;
        scanf("%d", &t);
        while(t--)
        {
            scanf("%d%d%d", &n, &v, &k);
            for(int i=1; i<=n; i++)
                scanf("%d", &value[i]);
            for(int i=1; i<=n; i++)
                scanf("%d", &volume[i]);
            memset(dp, 0, sizeof(dp));
            for(int i=1; i<=n; i++)
            {
                for(int j=v; j>=volume[i]; j--)
                {
                    int kk = 1;
                    for(int ij=1; ij<=k; ij++)
                    {
                        a[kk++] = dp[j-volume[i]][ij]+value[i];
                        a[kk++] = dp[j][ij];
                    }
                    sort(a+1, a+kk, cmp);
                    kk = unique(a+1, a+kk)-a-1;
                    for(int ij=1; ij<=k; ij++)
                    {
                        if(ij>kk)
                            dp[j][ij] = 0;
                        else
                            dp[j][ij] = a[ij];
                    }
                }
            }
            printf("%d
    ", dp[v][k]);
        }
    
        return 0;
    }
  • 相关阅读:
    第二阶段冲刺第九天
    第二阶段冲刺第八天
    第二阶段冲刺第七天
    第二阶段冲刺第六天
    第二阶段冲刺第五天
    第二阶段冲刺第四天
    第二阶段冲刺第三天
    java-小组项目-需求视频
    绩效评估方法
    各组对我们的意见汇总
  • 原文地址:https://www.cnblogs.com/mengzhong/p/5461174.html
Copyright © 2011-2022 走看看