zoukankan      html  css  js  c++  java
  • hdu 2670 01背包变形

    题意:有n个男孩,每个男孩对女神都有一个love值Li和递减值Bi(love值每天递减这么多)。女神要从这n个男孩中选出k个男孩来一起去玩耍(每天选择一个男孩),要使这k个男孩的love值之和最大。

    分析:当选定的男孩一定时,肯定要尽早选择递减较快的男孩,所以先按照递减值由大到小排序,然后做01背包即可,花费是占一个人数(n个人中选择k个),价值是那一天的love值。

    总结一句话就是:排序然后求一个恰好装满的01背包。

     1 #include <algorithm>
     2 #include <cstdio>
     3 using namespace std;
     4 
     5 const int INF = -99999999;
     6 const int N = 1001;
     7 int dp[N];
     8 int n, k;
     9 
    10 struct Node
    11 {
    12     int l, b;
    13     bool operator < ( const Node & o ) const
    14     {
    15         return b > o.b;
    16     }
    17 } node[N];
    18 
    19 int main ()
    20 {
    21     while ( scanf("%d%d", &n, &k) != EOF )
    22     {
    23         for ( int i = 1; i <= n; i++ )
    24         {
    25             scanf("%d", &node[i].l);
    26         }
    27         for ( int i = 1; i <= n; i++ )
    28         {
    29             scanf("%d", &node[i].b);
    30         }
    31         dp[0] = 0;
    32         for ( int i = 1; i <= n; i++ )
    33         {
    34             dp[i] = INF;
    35         }
    36         sort( node + 1, node + 1 + n );
    37         for ( int i = 1; i <= n; i++ )
    38         {
    39             for ( int j = min( i, k ); j >= 1; j-- )
    40             {
    41                 dp[j] = max( dp[j], dp[j - 1] + node[i].l - ( j - 1 ) * node[i].b );
    42             }
    43         }
    44         printf("%d
    ", dp[k]);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    梦断代码阅读笔记03
    第十二周进度条
    找“水王”
    梦断代码阅读笔记02
    梦断代码阅读笔记01
    团队开发第二阶段个人博客(2)
    团队开发第二阶段个人博客(1)
    个人总结
    第16周学习进度条
    个人进度条第15周
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4646404.html
Copyright © 2011-2022 走看看