(DAG+固定终点的最长路和最短路)硬币问题

##题目:
有n种硬币,面值分别为v1, v2, …, vn,每种都有无限多。给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的最小值和最大值。

Input
第一行两个整数,n,S(1≤n≤100, 0≤S≤100000)。
第二行n个整数vi-1…n(1≤vi≤S)。

Output
第一行两个整数,分别表示硬币数目的最小值 a 和最大值 b 。无解则输出 -1 。
第二行 a 个整数分别表示使用的是第几种硬币。
第三行 b 个整数分别表示使用的是第几种硬币。

Sample Input
6 12
1 2 3 4 5 6

Sample Output
2 12
6 6
1 1 1 1 1 1 1 1 1 1 1 1

##分析与解

假如s是12,怎么弄个金钱加加减减就到十二呢
假设每个结点表示剩的钱数
怎么和DAG想到一块,可以这么想,现在已知一个路的起点s和终点0,每多加一个钱,s就变到另一个数s2,现在找s2和终点0的路,这样就成了一个DAG

##思考
我们用递推,想找剩下s元到剩下零元的最小使用钱的次数
现在找最短路径的话
递推公式:dmin[i]=min(dmin[i],dmin[i-v[j]]+1)
我们初始化dmin[0]=0剩下零元到零元不需要钱,次数为零
dmin[i]的话就是看dmin[i]到零元的最小使用钱次数,他需要和dmin[i-v[j]]+1比较,其中+1是说dmin[i-v[j]]加上v[j],使用了dmin[i-v[j]]加上一次使用v[j]的次数
我们可以发现dmin[s]可以由dmin[0]向上推出

那不妨把递推公式转换成迭代

如果剩下的钱i减去v[j]大于零,说明可以通过dmin[i-v[j]]+1来确定dmin[i]
那么假设我们的dmin[i]就等于dmin[i-v[j]]+1,并且dmin[0]等于0,所以这样一步一步推出dmin[s]

由于题目说字典序,我们再写最大最小值时候也是遇见大于max的就存标号,更改max,后面来个等于max的,我们不能再存标号,因为我们要的是第一个数,所以后面来的必须要大于max,我们才改标号

这个也是一样的道理,必须有新的dmin[i-v[j]]+1比之前的dmin[i-v[j2]]+1小的时候我们替换掉dmin[i]的值。
由于要考虑输出,输出的都是v[j],那我们就要记录每一个i他减的v[j]是什么,就是当dmin[i]>dmin[i-v[j]]+1时,我们不仅替换dmin[i]=dmin[i-v[j]]+1,还要替换path_min[i]=j,path_min[i-v[j]]=j2,如果i-v[j]=0,此时说明v[j]+v[j2]=s

这里写图片描述

我这输出没排序,如果要排序的话,存到数组里,然后输出

int V[maxN];i是第几种,v[i]是第i种的价值
int Dmin[maxS];dmin[i]是i到0所需的最小路径
int Dmax[maxS];
int path_min[maxS];path_min[i]是最小路径中由i走到下一个结点所减去的那个数v[j]的下标j
int path_max[maxS];

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;const int maxN=200;
const int maxS=200000;
const int inf=2000000000;
int n,S;
int V[maxN];
int Dmin[maxS];
int Dmax[maxS];
int path_min[maxS];
int path_max[maxS];void print_ans(int *d,int s){while(s){printf("%d ",d[s]);s-=V[d[s]];}
}int main()
{cin>>n>>S;for (int i=1;i<=n;i++){cin>>V[i];}for (int i=1;i<=S;i++){Dmin[i]=inf;Dmax[i]=-inf;}Dmin[0]=0;Dmax[0]=0;for (int i=1;i<=S;i++){for (int j=1;j<=n;j++)if (i>=V[j]){if (Dmin[i]>Dmin[i-V[j]]+1)//+1走的v【j】 {Dmin[i]=Dmin[i-V[j]]+1;path_min[i]=j;}if (Dmax[i]<Dmax[i-V[j]]+1){Dmax[i]=Dmax[i-V[j]]+1;path_max[i]=j;}}}cout<<Dmin[S]<<' '<<Dmax[S]<<endl;print_ans(path_min,S);printf("\n");print_ans(path_max,S);printf("\n");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java虚拟机堆栈工作原理_java虚拟机工作原理?

展开全部从宏观上介绍一下Java虚拟机的e5a48de588b662616964757a686964616f31333363373731工作原理。从最初编写的Java源文件(.java文件)是如何一步步执行的&#xff0c;如下图所示&#xff0c;首先Java源文件经过前端编译器(javac或ECJ)将.java文件编译为Java字节码文件&#…

(BFS)Catch That Cow(poj3278)

题目&#xff1a; 农夫知道一头牛的位置&#xff0c;想要抓住它。农夫和牛都于数轴上 &#xff0c;农夫起始位于点 N(0<N<100000) &#xff0c;牛位于点 K(0<K<100000) 。农夫有两种移动方式&#xff1a; 1、从 X移动到 X-1或X1 &#xff0c;每次移动花费一分钟 2…

java jmx 监控_只用五分钟为系统实现基于JMX的监控

早期是作为J2EE的一部分, 因此总给人一种开发起来会很"重"的感觉, 这让不少Java程序员宁愿选择自行实现"轻量级"方案. 时至今日, 借助一些优秀的开源项目, JMX 也可以用起来很"轻".pojo-mbean 使用Annotation对MBean进行声明, 省去不少 JMX规范中…

wsld2java axis_Weblogic+axis2安装

Weblogicaxis2安装实验环境系统版本使用到软件软件版本Redhat 6.3Ld-linux.so.2Ld-linux.so.2 安装的weblogic的需要安装(系统自带)Weblogic10.3Axis21.41在以下实验中我使用的是1.41的war包 &#xff0c;下载war包的话可以在weblogic中进行部署。实验步骤&#xff1a;启动webl…

java流读写_java流概述以及文件读写示例

1. 先分清楚是字节流还是字符流。字节流&#xff1a;InputStream OutputStream字符流&#xff1a;Reader Writer字符流与字节流的区别是读取的单位长度不同&#xff0c;字节流读8字节&#xff0c;字符流读16字节&#xff0c;所以有中文时&#xff0c;就得用字符流。2. 在字节/字…

python自动化操作应用程序错误_web自动化中踩过的低级错误坑(python+selenium)

1.定位了元素没有做下一步操作&#xff0c;比如&#xff0c;点击、输入等功能&#xff0c;而报错&#xff0c;报错信息如下&#xff1a;2.上传图片时&#xff0c;定位元素&#xff0c;应该定位input标签&#xff0c;点击页面input标签肉眼没有看到定位到任何元素&#xff0c;以…

qgis折点打断_arcgis在折点处打断并建立网络分析(最短路径等问题)

目的&#xff1a;GIS网络分析用于对段路径等问题。这里仅仅讲述如何建立网络分析。网络建立前必须满足以下条件1.要素文件在节点处打断(本文下面会叙述)2.要素文件在地理数据库里的数据集里(一般是这样)3.要素文件包含的数据集里已经验证拓扑&#xff0c;并确保没有错误(可选)注…

base64 java php_利用PHP将图片转换成base64编码的实现方法

先来说一下为什么我们要对图片base64编码base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一。base64主要不是加密&#xff0c;它主要的用途是把某些二进制数转成普通字符用于网络传输。由于这些二进制字符在传输协议中属于控制字符&#xff0c;不能直接传送&…

(BFS)Knight Moves(hdu1372)

题目&#xff1a; 在象棋王国&#xff0c;尼古拉斯.火山是一匹英俊的马&#xff0c;他非常幸运迎娶了白马王国的公主&#xff0c;他们将度蜜月&#xff0c;你现在是他们的女仆&#xff0c;火山会问你去一些地方最少需要多少步&#xff0c;这么简单的事当然难不倒你。由于火山是…

java上机作业要注意什么_Java第八次上机作业

1、请按照以下要求设计一个学生类Student&#xff0c;并进行测试。要求如下&#xff1a;1)Student类中包含姓名、成绩两个属性2)分别给这两个属性定义两个方法&#xff0c;一个方法用于设置值&#xff0c;另一个方法用于获取值.3)Student类中定义一个无参的构造方法和一个接收两…

java windows 2008_Windows server 2008 R2 安装Java环境

一、配置环境操作系统软件包Windows server 2008 R2jdk_1.7.rar二、安装操作1.右击解压jdk_1.7.rar&#xff1b;解压后双击运行jdk-7u79-windows-i586 .exe2.点击【下一步】一直到有个【更改】按钮&#xff0c;可以更改安装路径&#xff0c;设置完成后点击“下一步”。到达这个…

java 匿名类型_Java之匿名类讲解

匿名类&#xff0c;正如名字一样在java中没有名字标识的类&#xff0c;当然了编译后还是会安排一个名字的。下面是一个关于匿名类的简单例子&#xff1a;public classClient {public static voidmain(String[] args) throws InterruptedException {Thread tnew Thread(newRunna…

(并查集)小希的迷宫

题目&#xff1a; 上次Gardon的迷宫城堡小希玩了很久&#xff08;见Problem B&#xff09;&#xff0c;现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样&#xff0c;首先她认为所有的通道都应该是双向连通的&#xff0c;就是说如果有一个通道连通了房间A和B&…

(并查集)食物链

题目&#xff1a; 动物王国中有三类动物A,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。A吃B&#xff0c; B吃C&#xff0c;C吃A。 现有N个动物&#xff0c;以1&#xff0d;N编号。每个动物都是A,B,C中的一种&#xff0c;但是我们并不知道它到底是哪一种。 有人用两…

多线程销售问题java_Java多线程Runable售票系统实现过程解析

一、无等待&#xff0c;直接出票【虽然解决了不会冲票问题&#xff0c;但显然不符合实际生活】&#xff1a;package com.thread.sale;public class Sale {public static void main(String[] args) {//悟&#xff0c;那么设计爬虫的时候&#xff0c;下载的资源唯一&#xff0c;使…

带权并查集-Building Block

题目&#xff1a; John are playing with blocks. There are N blocks (1 < N < 30000) numbered 1…N。Initially, there are N piles, and each pile contains one block. Then John do some operations P times (1 < P < 1000000). There are two kinds of ope…

(模拟+floyd)Saving James Bond

题目&#xff1a; This time let us consider the situation in the movie “Live and Let Die” in which James Bond, the world’s most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake filled with…

(dijkstra算法+多权值)最短路径问题

给你n个点&#xff0c;m条无向边&#xff0c;每条边都有长度d和花费p&#xff0c;给你起点s终点t&#xff0c;要求输出起点到终点的最短距离及其花费&#xff0c;如果最短距离有多条路线&#xff0c;则输出花费最少的。 Input 输入n,m&#xff0c;点的编号是1~n,然后是m行&am…

php 取经纬度,php根据地址获取百度地图经纬度的实例方法

首先我们来看全部实例代码&#xff1a;/*** param string $address 地址* param string $city 城市名* return array*/function getLatLng($address‘‘,$city‘‘){$result array();$ak ‘‘;//您的百度地图ak&#xff0c;可以去百度开发者中心去免费申请$url "http://…

php 留言板分页显示,php有分页的留言板,留言成功后怎么返回当前页?

比如我在【index.php?p3】发布留言&#xff0c;成功后怎么返回到 index.php?p3 这个页面&#xff1f;在【index.php?p5】发布留言成功后怎么返回index.php?p5这个页面&#xff1f;location.href"这里该怎么写&#xff1f;"涉及的页面有index.php&#xff0c;doac…