UVA12563劲歌金曲

描述:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int song[55],d[55][180 * 50 + 678];//前i首歌,刚好是j秒的最多歌数,这样就和01背包一样啦。
int main(){
	//freopen("d://poj//data.txt","w",stdout); 
	int T,n,t,i,j;
	scanf("%d",&T);
	for(int p = 0;p < T; ++p){
		scanf("%d%d",&n,&t);
		for(i = 1;i <= n; ++i)
			scanf("%d",song + i);
		sort(song,song + n);
		memset(d,-1,sizeof(d));
		for(i = 0;i < n; ++i)
			d[i][0] = 0;//第一首加入歌单的歌
		int cnt = -1;
		int sum = 0;
		for(i = 1;i <= n; ++i){
			for(j = 0;j < t; ++j){
				d[i][j] = d[i - 1][j];//之前加入的歌曲
				if(j >= song[i] && d[i - 1][j - song[i]] >= 0)//如果j能表示一首歌:第一首歌或者和之前的歌合起来是j
					d[i][j] = max(d[i][j],d[i - 1][j - song[i]] + 1);
				if(i == n){
					if(d[i][j] >= cnt){//因为之前排过序了,所以一定是剩余时间最少的。
						cnt = d[i][j];
						sum = j;
					}
				}
			}
		}
		printf("Case %d: %d %d\n",p + 1,cnt + 1,sum + 678);
	}   
	return 0;
} 

主要难点还是状态,不过此题还有一个地方,就是题目给出总时间的范围是10e9但显然此题范围不会超过所有歌唱满外加劲歌金曲的时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值