• HDU -2670 Girl Love Value


    这道题是刚好装满的背包问题,刚好选取k个,状态转移方程为dp[i][j] = max( dp[i - 1][j], dp[i - 1][j - 1] + Li - Bi(j - 1) ) 

    dp[i][j] 表示从前 i 个男孩中选取 j 个的 Li 的最大值, 首先按照Bi 排一下序,这个是利用贪心的思想,因为那样才能获得最优解,按照递减排序,这样才能找到最大值,然后就是dp了,状态转移方程的意思就是第 j 个去或者不 取,代码如下

    代码一(二维数组版):

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <string.h>
     4 #include <algorithm>
     5 using namespace std;
     6 struct Happy{
     7     int Li, Bi;
     8 };
     9 const int N = 1002;
    10 int dp[N][N]; 
    11 Happy happy[N];
    12 bool cmp(Happy a, Happy b)//递减排序 
    13 {
    14     return a.Bi > b.Bi;
    15 }
    16 int main()
    17 {
    18     int n, v;
    19     while (~scanf("%d %d", &n, &v))
    20     {
    21         memset(dp, 0, sizeof(dp)); 
    22         for (int i = 1; i <= n; i++)
    23             scanf("%d", &happy[i].Li);
    24         for (int i = 1; i <= n; i++)
    25             scanf("%d", &happy[i].Bi);
    26         sort(happy + 1, happy + n + 1, cmp);//贪心思想 
    27         for (int i = 1; i <= n; i++)
    28         {
    29             for (int j = 1; j <= i && j <= v; j++)
    30                 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + happy[i].Li - happy[i].Bi * (j - 1));
    31         }
    32         printf("%d
    ", dp[n][v]);
    33     }
    34     
    35     return 0;
    36 }

    代码二(优化空间版):

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <string.h>
     4 #include <algorithm>
     5 using namespace std;
     6 struct Happy{
     7     int Li, Bi;
     8 };
     9 const int N = 10002;
    10 int dp[N]; 
    11 Happy happy[N];
    12 bool cmp(Happy a, Happy b)//递减排序 
    13 {
    14     return a.Bi > b.Bi;
    15 }
    16 int main()
    17 {
    18     int n, v;
    19     while (~scanf("%d %d", &n, &v))
    20     {
    21         memset(dp, 0, sizeof(dp)); 
    22         for (int i = 1; i <= n; i++)
    23             scanf("%d", &happy[i].Li);
    24         for (int i = 1; i <= n; i++)
    25             scanf("%d", &happy[i].Bi);
    26         sort(happy + 1, happy + n + 1, cmp);//贪心思想 
    27         for (int i = 1; i <= n; i++)
    28         {
    29             for (int j = v; j >= 1; j--)
    30             /*这句话等价于dp[j] = max(dp[j], dp[j - 1] + happy[i].Li - happy[i].Bi * (j - 1)),只不过用if更快*/ 
    31                 if (dp[j - 1] + happy[i].Li - happy[i].Bi * (j - 1 ) > dp[j])
    32                     dp[j] = dp[j - 1] + happy[i].Li - happy[i].Bi * (j - 1 );
    33         }
    34         printf("%d
    ", dp[v]);
    35     }
    36     
    37     return 0;
    38 }
  • 相关阅读:
    linux驱动---等待队列、工作队列、Tasklets【转】
    Pinctrl子系统之一了解基础概念【转】
    Linux内存管理(最透彻的一篇)【转】
    linux驱动学习笔记---实现中断下半部以及驱动编写规范(七)【转】
    一些网址下载【转】
    Linux /proc/$pid部分内容详解【转】
    Linux kernel workqueue机制分析【转】
    Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)【转】
    Linux Kernel PANIC(三)--Soft Panic/Oops调试及实例分析【转】
    Linux内核调试的方式以及工具集锦【转】
  • 原文地址:https://www.cnblogs.com/Howe-Young/p/4152027.html
Copyright © 2020-2023  润新知