题目链接:https://uva.onlinejudge.org/external/125/12563.pdf

题意:n首歌,每首歌的长度给出,还剩 t 秒钟,由于KTV不会在一首歌没有唱完的情况下切歌,求在总曲目尽量多的情况下,唱的最久。

分析:

刚开始,题意看错了,结果就按01背包模板了,求了在 t 时间下唱的最久,然后再找出唱了几首歌。WA到疯了,最后实在是崩溃啊!

然后,这个题目没做出来,主要还是01背包没弄透彻。可以利用二维 [2][t] 的滚动数组求路径,这里不仅是优化了空间,而且,当我找到最优值的时候,可以很快找到路径 [p^1][]之前已经被覆盖,也就是说,哪些歌被选了,就有[p^1][t] == ans;

然后要理解p^1,这样的覆盖,刚开始p=1;p^1,进行了初始化,递推,每递推一层,p = p^1;最后,p被转化到下一个状态了,在找路径的时候要转化回来。

/*
#include <bits/stdc++.h>
using namespace std; #define C 1000000 int v[55];
int w[55];
int f[C]; int main()
{ int T;
int cases = 1;
scanf("%d",&T);
while(T--)
{
int n,t;
scanf("%d%d",&n,&t); int temp;
for(int i=1; i<=n; i++)
{
scanf("%d",&temp);
v[i] = temp;
w[i] = temp;
} memset(f,0,sizeof(f)); for(int i=1; i<=n; i++)
{
for(int j=t; j>=0; j--)
{
if(j>=v[i])
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
} //printf("%d\n",f[t]);
//printf("%d\n",f[t-1]); vector<int> ans;
ans.clear();
int sum = f[t];
for(int i=n; i>=1; i--)
{
if(sum-v[i]==f[sum-v[i]])
{
ans.push_back(v[i]);
sum-=v[i];
}
} sort(ans.begin(),ans.end()); if(f[t]>=t)
{
ans.clear();
int the_ans=-1;
for(int i=0; i<t; i++)
{
if(f[i]<f[t])
{
if(f[i]>the_ans)
the_ans = f[i];
}
}
int sum = the_ans;
for(int i=n; i>=1; i--)
{
if(sum-v[i]==f[sum-v[i]])
{
ans.push_back(v[i]);
sum-=v[i];
}
}
printf("Case %d: %d %d\n",cases++,ans.size()+1,the_ans+678);
}
else if(f[t]<t)
printf("Case %d: %d %d\n",cases++,ans.size()+1,f[t]+678); } return 0;
}
*/
#include <bits/stdc++.h>
using namespace std; int n,t; const int maxn=; int len[maxn];
int d[][maxn*+]; int main()
{
int T;
scanf("%d",&T); for(int kase = ; kase<=T; kase++)
{
scanf("%d%d",&n,&t);
for(int i=; i<=n; i++)
scanf("%d",&len[i]); for(int i=; i<t; i++)
d[][i] = -;
d[][] = ; int p = ,ans =;
for(int i=; i<=n; i++)
{
for(int j=; j<t; j++)
{
d[p][j] = d[p^][j];
if(j>=len[i]&&d[p^][j-len[i]]>=)
{
d[p][j] = max(d[p][j],d[p^][j-len[i]]+);
}
ans = max(ans,d[p][j]);
}
p = p^;
}
for(int i=t-; i>=; i--)
{
if(d[p^][i]==ans)
{
printf("Case %d: %d %d\n",kase,ans+,i+);
break;
}
}
} return ;
}

Uva 12563,劲歌金曲,01背包的更多相关文章

  1. UVA 12563 劲歌金曲(01背包)

    劲歌金曲 [题目链接]劲歌金曲 [题目类型]01背包 &题解: 题意:求在给定时间内,最多能唱多少歌曲,在最多歌曲的情况下,使唱的时间最长. 该题类似于01背包问题,可用01背包问题的解题思路 ...

  2. UVa 12563 劲歌金曲(0-1背包)

    https://vjudge.net/problem/UVA-12563 题意: 在一定的时间内连续唱歌,最后一首唱11分钟18秒的劲歌金曲,问最多能长多长时间. 思路: 0-1背包问题,背包容量为t ...

  3. UVa 12563 劲歌金曲 刘汝佳第二版例题9-5;

    Problem J Jin Ge Jin Qu [h]ao (If you smiled when you see the title, this problem is for you ^_^) Fo ...

  4. UVA.10130 SuperSale (DP 01背包)

    UVA.10130 SuperSale (DP 01背包) 题意分析 现在有一家人去超市购物.每个人都有所能携带的重量上限.超市中的每个商品有其相应的价值和重量,并且有规定,每人每种商品最多购买一个. ...

  5. UVA 562 Dividing coins --01背包的变形

    01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostre ...

  6. UVA 624 CD(01背包+输出方案)

    01背包,由于要输出方案,所以还要在dp的同时,保存一下路径. #include <iostream> #include <stdio.h> #include <stri ...

  7. UVA 562 Dividing coins (01背包)

    //平分硬币问题 //对sum/2进行01背包,sum-2*dp[sum/2] #include <iostream> #include <cstring> #include ...

  8. UVA 624 CD(DP + 01背包)

    CD You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music i ...

  9. uva 624 CD (01背包)

      CD  You have a long drive by car ahead. You have a tape recorder, but unfortunately your best musi ...

  10. UVA 624 CD[【01背包】(输出路径)

    <题目链接> 题目大意: 你要录制时间为N的带子,给你一张CD的不同时长的轨道,求总和不大于N的录制顺序 解题分析: 01背包问题,需要注意的是如何将路径输出. 由于dp时是会不断的将前面 ...

随机推荐

  1. C++Primer 第十六章

    //1.模板定义以关键字template开始,后跟一个模板参数列表,此列表不能为空.编译器用推断出的模板参数来实例化一个特定版本的函数.类型参数前必须使用class或者typename(推荐使用typ ...

  2. FlashBuilder 4.7 win64 和 mac版 下载地址

    win64 http://trials3.adobe.com/AdobeProducts/FLBR/4_7/win64/FlashBuilder_4_7_LS10_win64.exe mac http ...

  3. 使用Eclipse构建Maven项目 (转)

    Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包.本文仅对Eclipse中如何安装.配置和使用Maven进行了介绍.完全step by step. 如果觉得本文 ...

  4. 变形--矩阵 matrix()

    matrix() 是一个含六个值的(a,b,c,d,e,f)变换矩阵,用来指定一个2D变换,相当于直接应用一个[a b c d e f]变换矩阵.就是基于水平方向(X轴)和垂直方向(Y轴)重新定位元素 ...

  5. paper 77:[转载]ENDNOTE使用方法,常用!

    一.简介  EndNote是一款用于海量文献管理和批量参考文献管理的工具软件,自问世起就成为科研界的必备武器.在前EndNote时代,文献复习阶段从各大数据库中搜集到的文献往往千头万绪.或重复或遗漏, ...

  6. 【ipython技巧】使用shell命令

    在ipython终端时,可能临时需要使用shell命令进行简单处理: 可以在shell命令前面使用 !(感叹号) 比如在win7,ipython下想要使用sublime新建一个py,可以这样 !sub ...

  7. enum与typedef enum的用法

    一,两者的用法 枚举类型定义用关键字enum标识,形式为: enum 标识符 { 枚举数据表 }:枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定.数据枚举的顺序规定了枚举 ...

  8. 【SPFA】 最短路计数

    最短路计数 [问题描述]   给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. [输入格式]   输入第一行包含2个正整数N,M,为图的顶点数与边数. ...

  9. oracle中dual表的使用

    dual表是一个虚拟表,用来和select语句一起使用.1.查看当前用户select  user from dual2.用来调用系统函数select to_char(sysdate,'yyyy-mm- ...

  10. nginx 反向代理 和lvs负载均衡

    nginx反向代理:用户请求nginx代理服务器然后代理服务器将用户请求转为服务器再由nginx代理服务器将服务器的响应反应给用户. lvs负载均衡:用户请求nginx代理服务器然后代理服务器将用户请 ...