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 }
原文地址:https://www.cnblogs.com/huoxiayu/p/4646404.html