• [Uva12563] Jin Ge Jin Qu hao (完全背包,dp)


    题目链接:https://vjudge.net/problem/UVA-12563

    题意:n首歌要在m-1的时间内挑k首唱,现在希望在k尽可能大的情况下,时间尽可能长地唱。问最后最大k+1多大,最长时间+678多长。

    普通完全背包,附加额外记一维记录歌曲个数。先判断当个数相同的时候,仅更新时长,否则两个都更新。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn = 55;
     5 const int maxm = 11000;
     6 int n, m, p;
     7 int w[maxn], f[maxn][maxm][2];
     8 
     9 
    10 signed main() {
    11     // freopen("in", "r", stdin);
    12     // freopen("out", "w", stdout);
    13     int T, _ = 1;
    14     scanf("%d", &T);
    15     while(T--) {
    16         scanf("%d%d",&n,&m);
    17         for(int i = 1; i <= n; i++) scanf("%d", &w[i]);
    18         m--;
    19         memset(f, 0, sizeof(f));
    20         for(int i = 1; i <= n; i++) {
    21             for(int j = 0; j <= m; j++) {
    22                 f[i][j][0] = f[i-1][j][0];
    23                 f[i][j][1] = f[i-1][j][1];
    24                 if(j >= w[i]) {
    25                     if(f[i][j][1] == f[i-1][j-w[i]][1] + 1) {
    26                         f[i][j][0] = max(f[i][j][0], f[i-1][j-w[i]][0]+w[i]);
    27                     }    
    28                     else if(f[i][j][1] < f[i-1][j-w[i]][1] + 1) {
    29                         f[i][j][1] = f[i-1][j-w[i]][1] + 1;
    30                         f[i][j][0] = f[i-1][j-w[i]][0] + w[i];
    31                     }
    32                 }
    33             }
    34         }
    35         printf("Case %d: %d %d
    ", _++, f[n][m][1]+1, 678+f[n][m][0]);
    36     }
    37     return 0;
    38 }
  • 相关阅读:
    BSON与JSON的区别
    Zookeeper --分布式应用程序协调服务
    Stream Big Data : Storm, Spark and Samza
    Java Virtual Machine
    day1 计算机基础
    畅通工程(kruskal算法)
    The Suspects (并查集)
    The Sum of 0 for four numbers(拆解加二分思想)
    Rebranding(字母代换)
    最长公共子序列和最长公共子串
  • 原文地址:https://www.cnblogs.com/kirai/p/7288063.html
Copyright © 2020-2023  润新知