DAG动态规划-硬币问题
题目:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多。给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值!
#include <bits/stdc++.h>
using namespace std;
int n, m, t;
const int INF = 0x3f3f3f3f;
int a[1005],Max[1005],Min[1005];
void dfs(int *d, int s)
{
for(int i=1; i<=n; i++)
if(s>=a[i] && d[s] == d[s-a[i]]+1){
printf("%d ",i);
dfs(d,s-a[i]);
break;
}
}
int main()
{
cin >> n >> m;
for(int i=1;i<=n; i++) cin>>a[i];
for(int i=1;i<=m;i++){
Min[i]=INF;
Max[i]=-INF;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i >= a[j]){
Max[i] = max(Max[i-a[j]]+1,Max[i]);
Min[i] = min(Min[i-a[j]]+1,Min[i]);
}
}
}
cout << Max[m] <<' '<< Min[m] << endl;
dfs(Max,m);
cout<<endl;
dfs(Min,m);
}
/*
3 8
1 2 4
*/
#include <bits/stdc++.h>
using namespace std;
int n, m, t;
const int INF = 0x3f3f3f3f;
int a[1005],Max[1005],Min[1005],Max_[1005],Min_[1005];
void dfs(int *d, int s)
{
for(int i=1; i<=n; i++)
if(s>=a[i] && d[s] == d[s-a[i]]+1){
printf("%d ",i);
dfs(d,s-a[i]);
break;
}
}
void print(int *d, int s)
{
while(s){
printf("%d ",d[s]);
s -= a[d[s]];
}
}
int main()
{
cin >> n >> m;
for(int i=1;i<=n; i++) cin>>a[i];
for(int i=1;i<=m;i++){
Min[i]=INF;
Max[i]=-INF;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i >= a[j]){
if(Min[i] > Min[i-a[j]]+1){
Min[i] = Min[i-a[j]]+1;
Min_[i] = j;
}
if(Max[i] < Max[i-a[j]]+1){
Max[i] = Max[i-a[j]]+1;
Max_[i] = j;
}
}
}
}
cout << Max[m] <<' '<< Min[m] << endl;
//dfs(Max,m);
print(Max_,m);
cout<<endl;
//dfs(Min,m);
print(Min_,m);
}
/*
3 8
1 2 4
*/
DAG动态规划-硬币问题的更多相关文章
- uva 11324 The Largest Clique(强连通分量缩点+DAG动态规划)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...
- DAG模型——硬币问题
硬币问题 有n种硬币,面值分别为V1,V2,...,Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值.1<=n<=100, 0& ...
- DAG 动态规划 巴比伦塔 B - The Tower of Babylon
题目:The Tower of Babylon 这是一个DAG 模型,有两种常规解法 1.记忆化搜索, 写函数,去查找上一个符合的值,不断递归 2.递推法 方法一:记忆化搜索 #include < ...
- Test 6.29 T3 小学生
问题描述 "不错,不错!那么,准备好迎接下一道题了么?"一道白光闪过,CJK 眼前出现了 1e100 个小学生."他们中,有一些人轨了我的机子.现在,我需要你在 1S 之 ...
- jieba分词流程及部分源码解读(一)
首先我们来看一下jieba分词的流程图: 结巴中文分词简介 1)支持三种分词模式: 精确模式:将句子最精确的分开,适合文本分析 全模式:句子中所有可以成词的词语都扫描出来,速度快,不能解决歧义 搜索引 ...
- 图的连通性--Tarjan算法
一些概念 无向图: 连通图:在无向图中,任意两点都直接或间接连通,则称该图为连通图.(或者说:任意两点之间都存在可到达的路径) 连通分量: G的 最大连通子图 称为G的连通分量. 有向图 (ps.区别 ...
- DAG上动态规划
很多动态规划问题都可以转化为DAG上的最长路,最短路,或路径计数问题. 硬币问题: 有N中硬币,面值分别为v1,v2,v3,……vn,每种都无穷多,给定非负整数S,可以选用多少个硬币,使他们的总和恰好 ...
- DAG 上的动态规划(训练指南—大白书)
有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.矩形嵌套 题目描述: ...
- DP入门(2)——DAG上的动态规划
有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.DAG模型 [嵌套矩形问题] 问题 ...
随机推荐
- 网易考拉Android客户端网络模块设计
本文来自网易云社区 作者:王鲁才 客户端开发中不可避免的需要接触到访问网络的需求,如何把访问网络模块设计的更具有扩展性是每一个移动开发者不得不面对的事情.现在有很多主流的网络请求处理框架,如Squar ...
- 《Cracking the Coding Interview》——第18章:难题——题目1
2014-04-29 00:56 题目:不用算数运算,完成加法. 解法:那就位运算吧,用加法器的做法就可以了. 代码: // 18.1 add two numbers wihout using ari ...
- 记录下MoKee编译过程
纯属记录帖 关注和了解这个rom有段时间了. 最近有需要了解odex,折腾了几天还是在坑里. 索性,先编译下MoKee看看. 之前make过 4.2 和 5.1 ,刷到模拟器和N5里. 编译教程可以参 ...
- 【非原创】tomcat 安装时出现 Failed to install Tomcat7 service
tomcat 安装时出现 Failed to install Tomcat7 service 今天在安装tomcat时提示 Failed to install Tomcat7 service了,花了大 ...
- 抓包工具 - Fiddler - (二)
<转载自 miantest> 在上一篇中介绍了Fiddler的基本使用方法.通过上一篇的操作我们可以直接抓取浏览器的数据包.但在APP测试中,我们需要抓取手机APP上的数据包,应该怎么操作 ...
- == 与 equals 之区别
"=="和equals方法究竟有什么区别? (单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ==操作符专门用来比较两个变量的值 ...
- linux备忘录-基本命令
基本命令 将命令分类为获取信息类,文件管理类,目录管理类,文本处理类,系统类,工具类. 获取信息类 uname # 输出所有信息 # 一行输出,空格分割 uname -a # 输出内核名称 uname ...
- jsp页面中引入java类
<%@ page import="java.util.*" %>
- Hexo NexT主题添加点击爱心效果
给NexT主题内添加页面点击出现爱心的效果 创建js文件 在/themes/next/source/js/src下新建文件clicklove.js,接着把该链接下的代码拷贝粘贴到clicklove.j ...
- 【bzoj2969】矩形粉刷 期望
题目描述 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩 ...