UVA 624 CD(01背包+输出方案)
01背包,由于要输出方案,所以还要在dp的同时,保存一下路径。
#include <iostream>
#include <stdio.h>
#include <string.h>
/*
AC
01背包+输出方案
答案不唯一,就像样例中的
45 8 4 10 44 43 12 9 8 2
题目给出的输出4 10 12 9 8 2 sum:45
输出43 2 sum:45 也是可以的
题目中没要求按照什么顺序输出,输出一种方案即可 */
using namespace std;
const int maxm=;
const int maxn=;
int n,m;
int cd[maxm];
int dp[maxn];
struct Node{
int idx; //若idx为0,表示当前物品没有被选择,否则即为选择了
int pre; //设立前驱,即 不装当前物品时的背包容量的大小
}node[maxm][maxn]; //node[i][j]:i表示当前物品的编号,j表示当前的背包容量
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=;i<=m;i++){
scanf("%d",&cd[i]);
}
for(int i=;i<=m+;i++){
for(int j=;j<=n+;j++)
node[i][j].idx=node[i][j].pre=;
}
memset(dp,,sizeof(dp));
//原本以为选择的CD要按原来的顺序输出,才将i逆序
//结果改成从正序循环,照样AC
//而且题目中也没要求按照什么顺序输出,打印一种结果即可
for(int i=m;i>=;i--){
//注意这里j要从n到1
for(int j=n;j>;j--){
if(j>=cd[i] && dp[j-cd[i]]+cd[i]>dp[j]){
dp[j]=dp[j-cd[i]]+cd[i];
node[i][j].idx=i; //选择了当前物品
node[i][j].pre=j-cd[i]; //指向node[i+1][j-cd[i]]
}
else{
node[i][j].idx=; //当前物品没有被选择
node[i][j].pre=j; //指向node[i+1][j]
}
}
}
int tmp=n,k=;
while(k<=m){
if(node[k][tmp].idx!=)
printf("%d ",cd[k]);
tmp=node[k][tmp].pre;
k++;
}
printf("sum:%d\n",dp[n]);
}
return ;
}
UVA 624 CD(01背包+输出方案)的更多相关文章
- UVA 624 - CD (01背包 + 打印物品)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 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背包)
//路径记录方法:若是dp[j-value[i]]+value[i]>dp[j]说明拿了这个东西,标志为1, //for循环标志,发现是1,就打印出来,并把背包的容量减少,再在次容量中寻找标志: ...
- uva 624 CD 01背包打印路径
// 集训最终開始了.来到水题先 #include <cstdio> #include <cstring> #include <algorithm> #includ ...
- 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 ...
- uva 624 CD (01背包)
CD You have a long drive by car ahead. You have a tape recorder, but unfortunately your best musi ...
- UVA624 CD,01背包+打印路径,好题!
624 - CD 题意:一段n分钟的路程,磁带里有m首歌,每首歌有一个时间,求最多能听多少分钟的歌,并求出是拿几首歌. 思路:如果是求时常,直接用01背包即可,但设计到打印路径这里就用一个二维数组标记 ...
- CD(01背包)
You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is o ...
- Buy the souvenirs---hdu2126(01背包输出方案数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 有n个物品每个物品的价格是v[i],现在有m元钱问最多买多少种物品,并求出有多少种选择方法: 如 ...
随机推荐
- ubuntu14.04字符界面中文乱码及中文输入
作为ubuntu用户字符界面是绝对不陌生的,尤其是维护管理服务器的朋友为了节省资源都是用的字符界面,但是默认字符界面中文目录文件都是乱码,根本无法打开编辑,那么怎么让字符界面显示中文目录文件,还有在字 ...
- iOS学习之C语言函数指针
通过函数名调用函数: int max = maxValue(4, 5); printf("max = %d\n", max); 函数类型:int (int, int) 1. ...
- Status Bar in iOS7
This is a very important change in iOS 7: the status bar is no longer a separate bar. It’s now somet ...
- [转]分布式文件系统FastDFS架构剖析
[转]分布式文件系统FastDFS架构剖析 http://www.programmer.com.cn/4380/ 文/余庆 FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实 ...
- 59.DDR3_IP核文件设置
在ISE软件生成DDR3 IP核时,会产生很多文件,其中user_design,example_design里面分别是用户接口文件和自带的仿真测试文件.在user_design里的rtl中,这些文件是 ...
- 初探Xamarin
Xamarin是一个基于mono的商业项目,收费,而且贼贵.官网地址是:http://xamarin.com/ 就我个人理解,收费的Xamarin提供一个for visual studio 2010/ ...
- MATLAB连通域标记函数
L = bwlabel(BW,n)返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1.2.num(连通区域的个数).n的值为4或8,表示是按4连通寻找区域,还是 ...
- PSPO表格
一.项目计划总结: 周活动总结表 日期 任务 听课 编写程序 阅读课本 准备考试 日总计 周日 周一 周二 300 100 30 430 周三 100 50 30 180 周四 200 ...
- CS小分队第一阶段冲刺站立会议(5月9日)
昨日完成工作:对新子项目进行构思规划 遇到问题:不知道如何将excel表导入C#,对于timer控件不熟悉 今日计划:完成将存在EXCEL表中的名单导入,并进行抽号,熟悉timer控件
- 二、break,continue区别
break:作用于switch,和循环语句,用于跳出,或者称为结束 break语句单独存在,下面不要定义其他语句,因为执行不到,编译会失败,当循环套时,break会跳出当前所在循环,要跳出外部循环,只 ...