1. 01背包为什么在枚举前i个物品能构成的最大价值的时候,倒序遍历背包的容量

原因:如果正序枚举的话,就变成了多重背包,若倒叙枚举,初始情况下,dp[j-a[i]]是0,但正序的话很有可能是第i个物品已经填充好的了(具体请自行模拟)

2.  如何实现最小序列的输出(即本题的卖点,以及整理的原因)

原因:这需要从问题本身来分析,如果m的背包恰好装m价值的物品,那么就一定是最优的,我们用一个标记数组来标记某一容量的背包在何时被更新,首先对物品价值进行降序排序,之后通过倒叙遍历book数组就可以实现输出了

L3-001 凑零钱 (30分)

韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 10​4​​ 枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。

输入格式:

输入第一行给出两个正整数:N(≤10​4​​)是硬币的总个数,M(≤10​2​​)是韩梅梅要付的款额。第二行给出 N 枚硬币的正整数面值。数字间以空格分隔。

输出格式:

在一行中输出硬币的面值 V​1​​≤V​2​​≤⋯≤V​k​​,满足条件 V​1​​+V​2​​+...+V​k​​=M。数字间以 1 个空格分隔,行首尾不得有多余空格。若解不唯一,则输出最小序列。若无解,则输出 No Solution

注:我们说序列{ A[1],A[2],⋯ }比{ B[1],B[2],⋯ }“小”,是指存在 k≥1 使得 A[i]=B[i] 对所有 i<k 成立,并且 A[k]<B[k]。

输入样例 1:

8 9
5 9 8 7 2 3 4 1

输出样例 1:

1 3 5

输入样例 2:

4 8
7 2 4 3

输出样例 2:

No Solution
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 10015
int n,m;
int a[MAXN],dp[MAXN];
bool book[MAXN][MAXN];
bool cmp(int x,int y)
{return x>y;
}
int main()
{cin>>n>>m;for(int i = 1; i <= n; i++)cin>>a[i];sort(a+1,a+n+1,cmp);for(int i = 1; i <= n; i++){for(int j = m; j >= a[i]; j--){if(dp[j-a[i]] + a[i] >= dp[j]){dp[j] = dp[j-a[i]] + a[i];book[i][j] = true;}}}if(dp[m] == m){int w = m, inf = n;bool f = false;while(w!=0){if(book[inf][w]){cout<<"inf = "<<inf<<" w = "<<w<<" book[inf][w] = "<<book[inf][w]<<endl;if(!f){printf("%d\n",a[inf]);f = true;}else printf(" %d\n",a[inf]);w -= a[inf];}inf--;}}else printf("No Solution");return 0;
}

L3_01 01背包和最小序列相关推荐

  1. 问题 E: 序列操作Ⅰ(01背包)

    问题 E: 序列操作Ⅰ 时间限制: 1 Sec 内存限制: 128 MB [提交][状态][讨论版] 题目描述 给定长度为 N 的正整数序列 A_1, A_2, A_3,-, A_N, 从中选出若干个 ...

  2. 【Atcoder agc020 C】Median Sum,序列子集和中位数,bitset,01背包

    problem C - Median Sum / Time Limit: 2 sec / Memory Limit: 512 MB Score : 700 points Problem Stateme ...

  3. 最小邮票数(01背包)

    题目描述 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值.     如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可. 输入描述: 有多组数 ...

  4. 01背包 (dp专题)

    01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn.01背包是背包问题中最简单的问题.01背包的约束条件是给定几种物品,每种物品有 ...

  5. L3-001. 凑零钱-PAT团体程序设计天梯赛GPLT(01背包,动态规划)

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...

  6. cdoj31-饭卡(card) (01背包)

    http://acm.uestc.edu.cn/#/problem/show/31 饭卡(card) Time Limit: 3000/1000MS (Java/Others)     Memory ...

  7. 【CCCC】L3-001 凑零钱 (30分),,01背包路径打印

    problem L3-001 凑零钱 (30分) 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 ...

  8. 动态规划总结(01背包 完全背包 多重背包)

    动态规划总结(01背包 完全背包 多重背包) 一.学习资料 1.UVA DP 入门专题 2.夜深人静写算法(二) - 动态规划 3.算法之动态规划 4.什么是动态规划?动态规划的意义是什么? 5.01 ...

  9. 01背包输出路径、完全背包、多重背包

    背包问题 一.01 Knapsack(输出路径- >选的物品) 二.完全背包 1.三重循环,极可能TLE,滚动数组优化后j逆向枚举 2.二重,优化消去变量k(没有特别厘清,但可以直接从完全背包角 ...

  10. Codeforces Round #104 (Div. 2) E DP(01背包模型) +组和+除法取模求逆元

    题意: 规定只包含4或7的数为幸运数字,给定n个数的序列,求他的子序列,使得该子序列的长度为k并且满足该子序列中不存在相同的两个幸运数字.问一共寻在多少种可能.(只要该数的下标不同则认为是不同的序列) ...

最新文章

  1. vue-cli 使用小技巧
  2. C语言实现数据文件怎么找,急求如何将下列C语言程序数据存储到文件中?
  3. (三)虚拟化技术重点笔记与总结
  4. SpringBoot(Thymeleaf)拼接跳转链接
  5. android webdav客户端,WebDAV精灵(WebDAV客户端)
  6. 前端学习(3332):ant design介绍button
  7. mysql 终端 远程访问,通过终端连接到远程mysql
  8. php mysql 命令行模式_MySQL_MYSQL导入导出sql文件简析,一.MYSQL的命令行模式的设置- phpStudy...
  9. 腾讯副总裁程武取代吴文辉接管阅文集团 后者开盘涨近4%
  10. python模拟一个简单的取款机,python简单区块链模拟详解
  11. [转载] python集合add和update_python 集合set remove update add
  12. SSD——样本正负比控制+多尺度检测 (目标检测)(one-stage)(深度学习)(ECCV 2016)
  13. arduino红外两路寻迹c语言程序,Arduino寻迹小车程序
  14. 便携式频谱仪无人机机载频谱仪解决方案
  15. Word入门教程之插入文字批注(转)
  16. Unreal 4 更改Engine位置
  17. Linux Commnad ebook-convert 转换电子书
  18. ADS1220 24位高精度ADC芯片驱动
  19. Python 基础起步 (七) 初识字典 Dictionary(绝命毒师前传)
  20. python扇贝课程_“学点Python吧,别再这么累了。”

热门文章

  1. vim - 自动补齐
  2. 修改数据库表nbsp;字段参考的数据…
  3. 后台代码调用Application Resources
  4. c++线程间通信的几种方法_JAVA并发之线程amp;进程
  5. java 启动顺序_java语句执行顺序
  6. 计算机主机拆解报告心得体会,计算机拆装实验报告心得体会(共10篇).doc
  7. maven项目中操作mysql数据库案例
  8. 基于深度学习的目标检测
  9. python 获取指定城市【昨日天气+未来15天预报天气+空气质量+气象数据】
  10. git快速入门之一:创建本地仓库并同步到远程