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 }