题意:有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\n", dp[k]); 45 } 46 return 0; 47 }
时间: 2024-10-14 02:41:46