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元钱问最多买多少种物品,并求出有多少种选择方法: 如 ...
随机推荐
- spring事物的七种事物传播属性行为及五种隔离级别
首先,说说什么事务(Transaction). 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当 ...
- C语言如何 实现 下雪效果
题外话 前言 1.本文主要围绕 如何 在 控制台上 下起 一场 只有自己能看见的雪 2.是个简易跨平台的,主要是C语言 3.动画 采用 1s 40帧, 雪花具有 x轴速度和y轴速度 4.比较简单,可 ...
- 多路转接之poll和select
先看poll(): #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...
- 社保系列11《ATR》
1) 冷复位(Cold Reset) 当IC卡的电源电压和其他信号从静止状态中复苏且申请复位信号时,IC卡产生的复位. 2) 热复位(Warm Reset) 在时钟(CLK)和电源电压(VCC)处 ...
- spring与mysql整合数据源的配置
需要解决两点,数据源的配置交给spring完成,事务管理交个spring来管理. <context:property-placeholder location="classpath:c ...
- JavaScript 中怎样判断文本框只能输出英文字母、汉字和数字,不能输入特殊字符!
JS-只能输入中文和英文2008-11-08 10:17在js中用正则表达式对象(RegExp)判断中文 ^[\u0391-\uFFE5]+$英文 ^[A-Za-z]+$中文和英文/^[\u0391- ...
- mvc中使用knockoutjs和ajax
虽然说knockoutjs 官网上写的非常的清楚!但是像我这样的英语呕吐患者,真是虐心啊!今天我写下做个记录,也为那些初次使用的同学给予帮助, 首先我说一下今天我说的内容只是应用不做原理探究,如果没有 ...
- FTP上传文件夹
文件上传类 using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; usi ...
- 24.task的运用
任务就是一段封装在“task-endtask”之间的程序.任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的.调用某个任务时可能需要 ...
- 如何在Report Builder中使用fnd_profile.value
在EBS的Report开发中,需要根据客户化的一个Profile来控制用户可以访问的数据,可是在开发的过程中发现一直取不到该Profile的值,后来百度才找到了原因. 解决方法: 1.添加用户参数p_ ...