UVA 624 CD(01背包,要记录路径)
题意:
有n张CD(n<=20),每张能播放的时长不同。给定一个时长限制t,挑出部分的CD使得总播放时间最长。顺便输出路径!
思路:
重点在输出路径,否则这题很普通。那就要用二维数组记录每个CD是否要携带了,开个二维bool记录即可,位置就跟dp数组一样的,然后根据带或不带,来决定上一件物品在那个格子中。带了就在上一行的j-价值中,不带就在上一行的j中。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int N=;
int track[N];
int dp[N][];
bool path[N][]; void DFS(int n,int t)
{
if(t==)
return;
if(path[t][n]==true)
{
DFS( n-track[t-], t-);
printf("%d ",track[t-]);
}
else
DFS(n, t-);
} int cal(int n, int t)
{
for(int i=; i<t; i++)
{
for(int j=; j<track[i]; j++)//必要的,不然全是0
dp[i+][j] = dp[i][j]; for(int j=track[i]; j<=n; j++)
{
if( dp[i][j-track[i]]+track[i] >= dp[i][j] )
{
dp[i+][j] = dp[i][j-track[i]]+track[i];
path[i+][j]=true;
}
else dp[i+][j] = dp[i][j];
}
}
DFS( n, t);//递归输出路径
printf("sum:%d\n", dp[t][n]);
return ;
}
int main()
{
//freopen("input.txt","r",stdin);
int n, t;
while(cin>>n>>t)
{
memset(track,,sizeof(track));
memset(dp,,sizeof(dp));
memset(path, , sizeof(path)); int cnt=;
for(int i=; i<t; i++)
{
scanf("%d",&track[i]);
cnt+=track[i];
}
if(cnt<=n)//全部都能带的情况
{
for(int i=; i<t; i++)
printf("%d ", track[i]);
printf("sum:%d\n",cnt);
}
else cal(n, t);
}
return ;
}
AC代码
UVA 624 CD(01背包,要记录路径)的更多相关文章
- UVA 624 ---CD 01背包路径输出
DescriptionCD You have a long drive by car ahead. You have a tape recorder, but unfortunately your b ...
- UVA 624 - CD (01背包 + 打印物品)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- uva 624 CD 01背包打印路径
// 集训最终開始了.来到水题先 #include <cstdio> #include <cstring> #include <algorithm> #includ ...
- UVA 624 CD (01背包)
//路径记录方法:若是dp[j-value[i]]+value[i]>dp[j]说明拿了这个东西,标志为1, //for循环标志,发现是1,就打印出来,并把背包的容量减少,再在次容量中寻找标志: ...
- PAT L3-001 凑零钱(01背包dp记录路径)
韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...
- 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...
- uva 624 CD (01背包)
CD You have a long drive by car ahead. You have a tape recorder, but unfortunately your best musi ...
- UVA 624 CD(01背包+输出方案)
01背包,由于要输出方案,所以还要在dp的同时,保存一下路径. #include <iostream> #include <stdio.h> #include <stri ...
- 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 ...
- UVA624 CD,01背包+打印路径,好题!
624 - CD 题意:一段n分钟的路程,磁带里有m首歌,每首歌有一个时间,求最多能听多少分钟的歌,并求出是拿几首歌. 思路:如果是求时常,直接用01背包即可,但设计到打印路径这里就用一个二维数组标记 ...
随机推荐
- js中push(),pop(),unshift(),shift()的用法
js中push(),pop(),unshift(),shift()的用法小结 1.push().pop()和unshift().shift() 这两组同为对数组的操作,并且会改变数组的本身的长度及 ...
- js的prototype的详解(1)
一.什么是JavaScript中对象的prototype属性 JavaScript中对象的prototype属性,是用来返回对象类型原型的引用的.我们使用prototype属性提供对象的类的一组基本功 ...
- MATLAB---make与makefile简单介绍
1 make.makefile概述 makefile定义了一系列的规则,来规定哪些部分先编译,哪些部分后编译,写好makefile以后,只需一个make命令就可以让整个工程完全自动编译,所以简单的说, ...
- cinder存储服务
一.cinder 介绍: 理解 Block Storage 操作系统获得存储空间的方式一般有两种: 1.通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系 ...
- Vue2中实现微信分享支付功能
Vue2中实现微信分享支付功能 近期做了一个微信公众号前后分离项目,前端采用Vue2开发,后端SpringBoot,今天迫不及待的来给大家分享一下这次在开发中遇到的一些坑以及解决办法. 在这里,一些 ...
- 剑指Offer的学习笔记(C#篇)-- 二叉树的下一个节点(好理解版本)
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 一 . 理解题意 该题目我们可以借鉴一个非常影响不好的 ...
- CODING 告诉你硅谷的研发项目管理之道系列(6)
写在前面 优秀的研发管理者是怎么工作的,如何更加高效地管理研发团队?这些一直是 CODING关注的重要话题,我们不断地打磨 CODING 研发系统来让开发更简单.近期我们精心挑选了几篇硅谷科技公司研发 ...
- java CDI
Scope声明周期 http://www.cnblogs.com/yjmyzz/p/javaee-cdi-bean-scope.html
- JavaScript进阶 - 第8章 浏览器对象
第8章 浏览器对象 8-1 window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法:
- CC05:基本字符串压缩
题目 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能.比如,字符串"aabcccccaaa"经压缩会变成"a2b1c5a3".若压缩后的字符串没 ...