• HDU 3602 2012【01 背包变形】


    题意: 有 n 个团队和 m 艘船,每艘船的载客量为 k,每个团队的人数为ai+1 ,转载该团队可获利润 bi,要求每个团队的所有人必须在同一艘船上,

            且团队优先级高的团队所在船编号不能大于优先级低的团队,求可以获得的最大利润。

    题解:其实没什么,只需要01背包就可以了,只不过优先考虑团队优先级高的。
    分析:dp[i] 表示获得 i 利润时需要的最少船位,且要保证优先级高的团队优先考虑。

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cstring>
     6 
     7 #define INF 0x1f1f1f1f
     8 #define v 10005
     9 
    10 int min(int a,int b)
    11 {
    12     return a<b?a:b;
    13 }
    14 int dp[v+1];
    15 int n,m,k;
    16 int cal(int num,int a)
    17 {
    18     int tot=(num+k-1)/k;
    19     if(num+a<=tot*k)
    20         return num+a;
    21     return tot*k+a;
    22 }
    23 int main()
    24 {
    25     int Cas;
    26     scanf("%d",&Cas);
    27     while(Cas--)
    28     {
    29         scanf("%d%d%d",&n,&m,&k);
    30         memset(dp,INF,sizeof(dp));
    31         int a,b;
    32         dp[0]=0;
    33         while(n--)
    34         {
    35             scanf("%d %d",&a, &b);
    36             a++;
    37             for(int i=v-1; i>=b; i--)
    38                 if(dp[i-b]!=INF)
    39                     dp[i]=min(dp[i],cal(dp[i-b],a));
    40         }
    41         int i;
    42         for(i=v; i>=0; i--)
    43             if(dp[i]<m*k) break;
    44         printf("%d
    ",i);
    45     }
    46 }
  • 相关阅读:
    C库函数中字符串处理函数集合(转)
    浅谈C++底层机制
    vc2008快捷键
    Delphi格式输出的用法
    Devenv 命令行开关
    DX皮肤控制
    C#格式化
    linq查询DataView
    WCF中的session用法
    VS2012clickonce发布问题
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/7747633.html
Copyright © 2020-2023  润新知