01背包,由于要输出方案,所以还要在dp的同时,保存一下路径。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. /*
  5. AC
  6. 01背包+输出方案
  7. 答案不唯一,就像样例中的
  8. 45 8 4 10 44 43 12 9 8 2
  9. 题目给出的输出4 10 12 9 8 2 sum:45
  10. 输出43 2 sum:45 也是可以的
  11. 题目中没要求按照什么顺序输出,输出一种方案即可
  12.  
  13. */
  14. using namespace std;
  15. const int maxm=;
  16. const int maxn=;
  17. int n,m;
  18. int cd[maxm];
  19. int dp[maxn];
  20. struct Node{
  21. int idx; //若idx为0,表示当前物品没有被选择,否则即为选择了
  22. int pre; //设立前驱,即 不装当前物品时的背包容量的大小
  23. }node[maxm][maxn]; //node[i][j]:i表示当前物品的编号,j表示当前的背包容量
  24. int main()
  25. {
  26. while(scanf("%d%d",&n,&m)!=EOF){
  27. for(int i=;i<=m;i++){
  28. scanf("%d",&cd[i]);
  29. }
  30. for(int i=;i<=m+;i++){
  31. for(int j=;j<=n+;j++)
  32. node[i][j].idx=node[i][j].pre=;
  33. }
  34. memset(dp,,sizeof(dp));
  35. //原本以为选择的CD要按原来的顺序输出,才将i逆序
  36. //结果改成从正序循环,照样AC
  37. //而且题目中也没要求按照什么顺序输出,打印一种结果即可
  38. for(int i=m;i>=;i--){
  39. //注意这里j要从n到1
  40. for(int j=n;j>;j--){
  41. if(j>=cd[i] && dp[j-cd[i]]+cd[i]>dp[j]){
  42. dp[j]=dp[j-cd[i]]+cd[i];
  43. node[i][j].idx=i; //选择了当前物品
  44. node[i][j].pre=j-cd[i]; //指向node[i+1][j-cd[i]]
  45. }
  46. else{
  47. node[i][j].idx=; //当前物品没有被选择
  48. node[i][j].pre=j; //指向node[i+1][j]
  49. }
  50. }
  51. }
  52. int tmp=n,k=;
  53. while(k<=m){
  54. if(node[k][tmp].idx!=)
  55. printf("%d ",cd[k]);
  56. tmp=node[k][tmp].pre;
  57. k++;
  58. }
  59. printf("sum:%d\n",dp[n]);
  60. }
  61. return ;
  62. }

UVA 624 CD(01背包+输出方案)的更多相关文章

  1. UVA 624 - CD (01背包 + 打印物品)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. UVA 624 ---CD 01背包路径输出

    DescriptionCD You have a long drive by car ahead. You have a tape recorder, but unfortunately your b ...

  3. UVA 624 CD (01背包)

    //路径记录方法:若是dp[j-value[i]]+value[i]>dp[j]说明拿了这个东西,标志为1, //for循环标志,发现是1,就打印出来,并把背包的容量减少,再在次容量中寻找标志: ...

  4. uva 624 CD 01背包打印路径

    // 集训最终開始了.来到水题先 #include <cstdio> #include <cstring> #include <algorithm> #includ ...

  5. 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 ...

  6. uva 624 CD (01背包)

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

  7. UVA624 CD,01背包+打印路径,好题!

    624 - CD 题意:一段n分钟的路程,磁带里有m首歌,每首歌有一个时间,求最多能听多少分钟的歌,并求出是拿几首歌. 思路:如果是求时常,直接用01背包即可,但设计到打印路径这里就用一个二维数组标记 ...

  8. CD(01背包)

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

  9. Buy the souvenirs---hdu2126(01背包输出方案数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2126 有n个物品每个物品的价格是v[i],现在有m元钱问最多买多少种物品,并求出有多少种选择方法: 如 ...

随机推荐

  1. spring事物的七种事物传播属性行为及五种隔离级别

    首先,说说什么事务(Transaction). 事务,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当 ...

  2. C语言如何 实现 下雪效果

    题外话  前言 1.本文主要围绕 如何 在 控制台上 下起 一场 只有自己能看见的雪 2.是个简易跨平台的,主要是C语言 3.动画 采用 1s 40帧, 雪花具有 x轴速度和y轴速度 4.比较简单,可 ...

  3. 多路转接之poll和select

    先看poll(): #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  4. 社保系列11《ATR》

    1)  冷复位(Cold Reset) 当IC卡的电源电压和其他信号从静止状态中复苏且申请复位信号时,IC卡产生的复位. 2)  热复位(Warm Reset) 在时钟(CLK)和电源电压(VCC)处 ...

  5. spring与mysql整合数据源的配置

    需要解决两点,数据源的配置交给spring完成,事务管理交个spring来管理. <context:property-placeholder location="classpath:c ...

  6. JavaScript 中怎样判断文本框只能输出英文字母、汉字和数字,不能输入特殊字符!

    JS-只能输入中文和英文2008-11-08 10:17在js中用正则表达式对象(RegExp)判断中文 ^[\u0391-\uFFE5]+$英文 ^[A-Za-z]+$中文和英文/^[\u0391- ...

  7. mvc中使用knockoutjs和ajax

    虽然说knockoutjs 官网上写的非常的清楚!但是像我这样的英语呕吐患者,真是虐心啊!今天我写下做个记录,也为那些初次使用的同学给予帮助, 首先我说一下今天我说的内容只是应用不做原理探究,如果没有 ...

  8. FTP上传文件夹

    文件上传类 using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; usi ...

  9. 24.task的运用

    任务就是一段封装在“task-endtask”之间的程序.任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的.调用某个任务时可能需要 ...

  10. 如何在Report Builder中使用fnd_profile.value

    在EBS的Report开发中,需要根据客户化的一个Profile来控制用户可以访问的数据,可是在开发的过程中发现一直取不到该Profile的值,后来百度才找到了原因. 解决方法: 1.添加用户参数p_ ...