zoukankan      html  css  js  c++  java
  • HDU 2639 Bone Collector II

    对每一个容量都存取kk个价值,加入新的价值之后,进行排序,取前kk个价值(从大到小)。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<set>
     6 #include<vector>
     7 #include<map>
     8 #include<algorithm>
     9 #include<cmath>
    10 #include<stdlib.h>
    11 using namespace std;
    12 int main()
    13 {
    14     int t,n,v,kk,i,j;
    15     int dp[1010][75];
    16     int va[1010],vo[1010];
    17     cin>>t;
    18     while(t--)
    19     {
    20         cin>>n>>v>>kk;
    21         memset(dp,0,sizeof(dp));
    22         for(i=0;i<=v;i++)    //dp[i][0] 表示容量为 i 的价值种类数
    23         dp[i][0]=1;
    24         for(i=1; i<=n; i++)
    25             cin>>va[i];
    26         for(i=1; i<=n; i++)
    27             cin>>vo[i];
    28 
    29         for(i=1;i<=n;i++)
    30         for(j=v;j>=vo[i];j--){
    31             int cnt=dp[j][0];
    32             for(int k=1;k<=dp[j-vo[i]][0];k++)
    33                 dp[j][++cnt]=dp[j-vo[i]][k]+va[i];
    34             int tmp[70],num=1;
    35             for(int k=1;k<=cnt;k++)
    36             tmp[k]=dp[j][k];
    37             sort(tmp+1,tmp+1+cnt);      //对价值进行排序,之后取前kk个价值,如果不足则全取
    38             dp[j][1]=tmp[cnt];
    39             for(int k=cnt-1;k>=1;k--)   //取前kk个价值,如果不足则全取
    40             if(tmp[k]!=tmp[k+1])
    41             {
    42                 if(num+1>kk)
    43                 break;
    44                 dp[j][++num]=tmp[k];
    45             }
    46             dp[j][0]=num;
    47         }
    48         if(dp[v][0]<kk)
    49         cout<<0<<endl;
    50         else
    51         cout<<dp[v][kk]<<endl;
    52     }
    53 }
  • 相关阅读:
    taglib
    ThinkPHP魔术方法
    给图片添加文字
    公益筹模板
    清空(数据库+文件夹)
    php——文件下载
    查询上一个tp语句
    安装wampserver 2.5的时候出现丢失MSVCR100.dll的解决办法。
    ThinkPHP3.2.3 安装教程
    java基础——File类的基本用法
  • 原文地址:https://www.cnblogs.com/ainixu1314/p/3844532.html
Copyright © 2011-2022 走看看