hdu3496 Watch The Movie

本文探讨了在有限时间内选择观看最满意电影的策略,通过使用背包问题解决算法,帮助多多的叔叔在有限预算下做出最佳选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

 新学期的到来,多多明天必须去上学,今天她决定晚上玩得开心点,她喜欢看卡通。所以她希望她的叔叔买一些电影给她今晚看。她的祖父给了她 L 分钟看卡通。之后,她不得不去睡觉。多多将N个电影编号为从1到N .都是她最喜欢的电影,她希望她的叔叔买给她。每个电影有个值val,每部电影都有一个时间T。多多不会中止一个电影的播放,但有一个奇怪的问题,商店出售M个电影(而不是更少或更多),她的叔叔。如何选择M块电影从N个电影中选出最高价值和时间成本不超过L。   你有多聪明!请帮助执委郑景贤+美女多多的叔叔。

输入数据:

1 //表示样例总数

3 2 10 //每个样例的第一行表示N,M,L

11 100 //N行的每个电影的时间t和价值val

2

9 1

解法:

二维费用的背包问题,详见背包九讲

此题要注意初始化问题

在初始状态,只有时间为0的时候可以确定状态并出初始化为0,其余状态应初始化为负无穷大

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
class DVD
{
public:
	int time;
	int val;
}Movie[110];
int d[1100][110];//
/*void print(int l,int m)//调试用的一个函数
{
	cout<<endl;
	for(int i=0;i<=l;i++)
	{
		for(int j=0;j<=m;j++)
		{
			cout<<d[i][j]<<' ';
		}
		cout<<endl;
	}
	cout<<endl;
}*/
int main()
{
	int total;
	scanf("%d",&total);
	while(total--)
	{
		int n;//N: the number of DVD that DuoDuo want buy. 
		int m;//M: the number of DVD that the shop can sale.
		int l;//L: the longest time that her grandfather allowed to watch.
		scanf("%d %d %d",&n,&m,&l);
		for(int i=0;i<n;i++)
		{
			scanf("%d %d",&Movie[i].time,&Movie[i].val);
		}
		//d[i][j][k]表示前i件物品j分钟k大小的最大值
		memset(d,-1,sizeof(d));//未确定的状态
		for(int i=0;i<=l;i++)
		{
			d[i][0]=0;//唯一可以确定的状态
		}
		//print(l,m);
		for(int i=0;i<n;i++)
		{
			for(int j=l;j>=Movie[i].time;j--)
			{
				for(int k=m;k>=1;k--)
				{
					if(d[j-Movie[i].time][k-1]==-1)//未确定的状态显然不能转移
					{
						continue;
					}
					if(d[j][k]<d[j-Movie[i].time][k-1]+Movie[i].val)
					{
						d[j][k]=d[j-Movie[i].time][k-1]+Movie[i].val;
					}
				}
			}
			//print(l,m);
		}
		if(d[l][m]==-1)
		{
			printf("0\n");
			continue;
		}
		printf("%d\n",d[l][m]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值