USACO Raucous Rockers——dp

题解:本题主要考察DP
简要题意: n ( 1 < = n < = 20 ) n(1<=n<=20) n(1<=n<=20)首歌,每首歌 t i m e i time_i timei分钟,有 m ( 1 < = n < = 20 ) m(1<=n<=20) m(1<=n<=20)张CD,每一张CD最多可以容纳 t ( 1 < = t < = 20 ) t(1<=t<=20) t(1<=t<=20)分钟的音乐。歌曲必须按照创作的时间顺序在所有的CD上,求选中的歌曲数目最多的数量。
1.dp:本题可看出有三种状态:设 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示 i i i首歌, j j j张CD,该CD的容量为 k k k分钟
1.歌曲不装入CD:不变;
2.歌曲装入本张CD上: f [ i − 1 ] [ j ] [ k − t i m e [ i ] ] + 1 ) f[i-1][j][k-time[i]]+1) f[i1][j][ktime[i]]+1)
3.用一张新唱片: f [ i − 1 ] [ j − 1 ] [ t ] + 1 f[i-1][j-1][t]+1 f[i1][j1][t]+1
可以看出其实就是01背包的变形(二维背包),所以就可以降一维,方程为:
f [ j ] [ k ] = m a x ( f [ j ] [ k ] , f [ j − 1 ] [ t ] + 1 , f [ j ] [ k − t i m e [ i ] ] + 1 ) ; f[j][k]=max(f[j][k],f[j-1][t]+1,f[j][k-time[i]]+1); f[j][k]=max(f[j][k],f[j1][t]+1,f[j][ktime[i]]+1);
代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int timme[600],f[99][99];
int n,m,t,maxn;
int main()
{
	cin>>n>>t>>m;
	for(int i=1;i<=n;i++)cin>>timme[i];
	for(int i=1;i<=n;i++)
	for(int j=m;j>=1;j--)
	for(int k=t;k>=timme[i];k--)
	f[j][k]=max(f[j][k],max(f[j-1][t]+1,f[j][k-timme[i]]+1));
	for(int i=1;i<=m;i++)
	for(int j=1;j<=t;j++)
	maxn=max(maxn,f[i][j]);
	cout<<maxn<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值