• UVA12563Jin Ge Jin Qu hao01背包


    题意:

      给出t组数据,每组数据再给出num和time,代表下面共有三首歌曲和总共演唱时间,要求求出最长演唱时间和最多歌曲数量,输出时长,若是还有剩余时间,则可以演唱长为678s的歌曲

     

    再给出一组数据

    1

    3 100

    100 100 100  输出:678

     

    为什么我一开始会想到用暴力来写。。。我只想到了一点是对的,就是时间刚开始处理的时候-1。其他没了。。

     

    注意:这里对于dp数组的处理需要注意一下,还有就是最后遍历的时候从前往后和从后往前下面的判断条件是不一样的

    dp[i]记录的是歌曲数目,里面的i记录的是时长

    在清空dp数组之后,又对dp[0]=1进行处理,目的是把题目给出的所有a[i]里面的元素dp值全部都+1

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<queue>
     6 using namespace std;
     7 #define inf 0x3f3f3f3f
     8 typedef long long ll;
     9 
    10 int a[5500];
    11 int dp[5500];
    12 int main()
    13 {
    14     int t=1;
    15     int tt;
    16     int num,time;
    17     scanf("%d",&tt);
    18     while(tt--)
    19     {
    20         scanf("%d %d",&num,&time);
    21         for(int i=1; i<=num; i++)
    22             scanf("%d",&a[i]);
    23         time--;
    24         memset(dp,0,sizeof(dp));
    25         dp[0]=1;
    26         for(int i=1; i<=num; i++)
    27         {
    28             for(int j=time; j>=a[i]; j--)
    29                 dp[j]=max(dp[j],dp[j-a[i]]+1);
    30         }
    31 
    32         int kk=0;
    33         int maxx=0;
    34         for(int i=0; i<=time; i++)
    35         {
    36             if(dp[i]>=maxx)
    37             {
    38                 maxx=dp[i];
    39                 kk=i;
    40                 //printf("%d ",i);
    41             }
    42         }
    43 //        printf("Case %d: %d %d\n",t++,kk,maxx+678);
    44         printf("Case %d: %d %d\n",t++,maxx,kk+678);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    Linux/Unix 新手和专家教程
    恢复Ext3下被删除的文件
    如何调试bash脚本
    8个实用而有趣Bash命令提示行
    使用grep恢复被删文件内容
    一些非常有意思的杂项资源
    chmod -x chmod的N种解法
    纯文本配置还是注册表
    面向对象的Shell脚本
    你可能不知道的Shell
  • 原文地址:https://www.cnblogs.com/OFSHK/p/11393226.html
Copyright © 2020-2023  润新知