浏览器标题切换
浏览器标题切换end

UVA-12563-Jin Ge Jin Qu hao-01背包

题意:

  给出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 }
复制代码
posted @   抓水母的派大星  阅读(152)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示