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模型 [嵌套矩形问题] 问题 ...
随机推荐
- 【Python】python模块加载
一个python文件就是一个模块 标准模块 python自带的模块就是标准模块,也就说可以直接import进来的就是标准模块 import datetime import random 第三方模块 别 ...
- Java基本-2对象与包
1.对象:通俗的来讲,就是一个东西,比如汽车是一个对象,人是一个对象,狗是一个对象. 2.类:她描述的是对象的行为或者状态,比如对象是汽车,那么嘞可以分为小汽车类,大货车类,客车类等. 在类中可以包含 ...
- 孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务
孤荷凌寒自学python第五十九天尝试使用python来读访问远端MongoDb数据服务 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第五天.今天的感觉是,mongoDB数 ...
- packstack测试环境安装heat
虚机all in one环境测试安装heat [root@armstrong ~]# tmux at -t mysql MariaDB [(none)]> CREATE DATABASE hea ...
- makefile规则整理
makefile规则整理 实际开发中,makefile改的多,写的少. 为了后面不要在编译链接这种地方花费太多的时间,在这里系统性的整理其规则: 基本格式 TARGET : PREREQUISITES ...
- STL之list使用简介
构造函数 list<int> c0; //空链表 list<); //建一个含三个默认值是0的元素的链表 list<,); //建一个含五个元素的链表,值都是2 list< ...
- Sockt编程(多线程)
服务器端: package com.zeph.serverclient; import java.io.BufferedReader; import java.io.IOException; impo ...
- POJ 1149 PIGS | 最大流问题
参考了这个PDF 第一道网络流啊!感动 #include<cstdio> #include<algorithm> #include<cstring> #includ ...
- JavaScript jQuery 中定义数组与操作及jquery数组操作 http://www.jb51.net/article/76601.htm
首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...
- linux中shell变量$#,$@,$0,$1,$2
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...