• 【dp】背包 jzoj 1280 from usaco


    题目描述

    你刚刚继承了流行的“破锣摇滚”乐队录制的尚未发表的N(1 <= N <= 20)首歌的版权。你打算从中精选一些歌曲,发行M(1 <= M <= 20)张CD。每一张CD最多可以容纳T(1 <= T <= 20)分钟的音乐,一首歌不能分装在两张CD中。

    不巧你是一位古典音乐迷,不懂如何判定这些歌的艺术价值。于是你决定根据以下标准进行选择:

    1.歌曲必须按照创作的时间顺序在所有的CD盘上出现。(注:第i张盘的最后一首的创作时间要早于第i+1张盘的第一首)

    2.选中的歌曲数目尽可能地多

    输入输出格式

    输入格式:

    第一行: 三个整数:N, T, M.

    第二行: N个整数,分别表示每首歌的长度,按创作时间顺序排列。

    输出格式:

    一个整数,表示可以装进M张CD盘的乐曲的最大数目。

    输入输出样例

    输入样例#1:
    4 5 2
    4 3 4 2
    输出样例#1:
    3

    代码如下

    #include<iostream>
    #include<string>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int f[500][500];
    int v[81];
    int c[1000000];
    int num[1000];
    int main()
    {
    	int n,t,m;
    	cin>>n>>t>>m;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>c[i];
    		num[i]=num[i-1]+c[i];
    	}
    	//最外层表示用的机器的个数
    	//再一层表示终点:
    	//再下一层表示机器j的背包过程的起点(v数组表示j的背包)
    	//f[j][u]=max(f[j-1][w-1]+v[t],f[j][u]);
    		for(int j=1;j<=m;j++)//用了几个背包
    		{
    			for(int u=1;u<=n;u++)//终点是u
    			{	
    				f[j][u]=f[j-1][u];
    				for(int w=1;w<=u;w++)//起点
    				{
    					memset(v,0,sizeof(v));
    					for(int r=w;r<=u;r++)//背包
    					{
    						for(int q=t;q-c[r]>=0;q--)
    							v[q]=max(v[q-c[r]]+1,v[q]);
    						f[j][u]=max(f[j-1][w-1]+v[t],f[j][u]);
    					}
    				}
    			}
    		}
    	cout<<f[m][n]<<endl;
    	return 0;
    }
    

      

  • 相关阅读:
    加载页面(Loading)
    js判断手机连接网络类型
    combotree的加载方法
    jquery.util.easyui.dialog
    datagrid后台分页js.js
    安卓使用Canvas绘制工作日程表
    【Oracle】OGG数据初始化之RMAN
    怎样优雅的管理ActionBar
    openwrt undefined reference to ‘getpwent_r’
    通过文件对照工具Merge数据库
  • 原文地址:https://www.cnblogs.com/Lazers/p/6513028.html
Copyright © 2020-2023  润新知