• UVa 12563 (01背包) Jin Ge Jin Qu hao


    如此水的01背包,居然让我WA了七次。

    开始理解错题意了,弄反了主次关系。总曲目最多是大前提,其次才是歌曲总时间最长。

    题意:

    在KTV房间里还剩t秒的时间,可以从n首喜爱的歌里面选出若干首(每首歌只能唱一次且如果唱就必须唱完),然后剩下至少1秒的时间来唱那首长678秒的歌曲。

    总曲目最多的前提下,尽量使歌曲总时间最长。

    分析:

    所给时间为t,在t-1秒内进行01背包,num[i]来记录剩余时间为 i 时能长的最多曲目,如果曲目相同还要记录最长时间。

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 const int maxn = 10000;
     8 int a[55], dp[maxn], num[maxn];
     9 
    10 int main(void)
    11 {
    12     #ifdef LOCAL
    13         freopen("12563in.txt", "r", stdin);
    14     #endif
    15 
    16     int T;
    17     scanf("%d", &T);
    18     for(int kase = 1; kase <= T; ++kase)
    19     {
    20         int n, t;
    21         scanf("%d%d", &n, &t);
    22         t--;
    23         for(int i = 0; i < n; ++i)
    24         {
    25             scanf("%d", &a[i]);
    26             if(a[i] > 180)    a[i] = 180;
    27         }
    28         memset(dp, 0, sizeof(dp));
    29         memset(num, 0, sizeof(num));
    30         for(int i = 0; i < n; ++i)
    31             for(int j = t; j >= a[i]; --j)
    32             {
    33                 if(num[j] < num[j-a[i]] + 1)
    34                 {
    35                     num[j] = num[j-a[i]] + 1;
    36                     dp[j] = dp[j-a[i]] + a[i];
    37                 }
    38                 else if(num[j] == num[j-a[i]] + 1)
    39                 {
    40                     dp[j] = max(dp[j], dp[j-a[i]] + a[i]);
    41                 }
    42             }
    43         printf("Case %d: %d %d
    ", kase, num[t]+1, dp[t]+678);
    44     }
    45 
    46     return 0;
    47 }
    代码君
  • 相关阅读:
    软件测试(来自于网络)
    selenium常用命令
    新员工入门
    常用测试点
    测试leader职责
    软件测试 —— 用例设计4(读书分享)
    Tomcat 基础二
    Github Pull Request的提出与采纳
    Unix套接字接口
    健壮的I/O(RIO)
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3999322.html
Copyright © 2020-2023  润新知