UVA 12563 劲歌金曲(两个最优条件的dp问题)

这道题目是基于紫书中0-1背包问题的一个变种,目标是在给定的n首歌曲中选择一部分,以使歌曲数量最多且总播放时间尽可能长。通过定义状态结构体,可以得出状态转移方程:dp[i][j] = MAX(dp[i-1][j], 选取第i首歌后的状态(数量+1,时间+j[t]))。" 4133626,256114,Java实现文件下载功能,"['Java', '文件操作', 'HTTP响应', '流处理']
摘要由CSDN通过智能技术生成

紫书上的0-1背包例题,但是跟普通的0-1背包还是有些差别。
题意: 在告知的n首歌曲里,要选取一些歌曲 使得 歌曲数量尽量多,其次 唱的时间也要尽量长。
那么我们假定 i与j,和0-1背包类似,i代表前i首歌曲,j代表的是时间,是不是跟0-1背包里的第几个物品和重量类似呢,
那么0-1背包里 dp[i][j]代表的是前i个物品里,总共能承受的最大重量j内存放的最大重量。
那么这道题,dp[i][j]又代表什么呢?
很容易发现,他既要代表 歌曲的数目,又要代表选取歌曲的总长
那么我们就可以用一个结构体来表示

struct Nature 
{
   
	int number; //代表选取的歌曲数目
	int totaltime; //代表选取的歌曲数目加起来的时间长度
	bool operator < (const Nature & h)
	{
   
		return number<h.number || ( number==h.number && totaltime < h.totaltime) ;
	}
	//重载小于运算符,用来后面比较(因为首先要看歌曲数量,后面再看时间长度)
};

OK,状态定义好了,那么状态转移方程该如何写呢,通过简单的0-1背包我们很容易就能够推出

dp[i][j] = MAX ( dp[i-1][j], 选取这首歌之后的状态(数目+1 时间+t[i] ) )

然后就是代码了

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值