(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字节码文件&#…

(二分)Trailing Zeroes (III)

题目&#xff1a; n的阶乘尾部有q个连续的0&#xff0c;现在给你q&#xff0c;请你算出满足条件的n&#xff0c;如果有多个n满足条件&#xff0c;输出最小的那个即可。 Input 输入一个T(T < 10000),表示样例数量。 每个样例输入一个q。(1 < q < 100,000,000) Outp…

ais文件还原到mysql_SQLSERVER 数据库可疑的解决步骤

异常关机后&#xff0c;金蝶帐套突然无法访问&#xff0c;发现数据库置疑&#xff0c;使用此方案解决&#xff1a;注意&#xff1a;在做任何修复操作之前&#xff0c;请务必备份.mdf/.ndf以及.ldf文件。一般情况下这样可以解决&#xff1a;1、将数据库设置为应急状态ALTER DATA…

(DFS)n皇后问题

Problem Description 在N*N的方格棋盘放置了N个皇后&#xff0c;使得它们不相互攻击&#xff08;即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45角的斜线上。 你的任务是&#xff0c;对于给定的N&#xff0c;求出有多少种合法的放置…

(DFS)棋盘问题(poj1321)

题目&#xff1a; 在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放k个棋子的所有可行的摆…

(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规范中…

(DFS or BFS)Find The Multiple(poj1426)

题目&#xff1a; 给定一个正整数n&#xff0c;请编写一个程序来寻找n的一个非零的倍数m&#xff0c;这个m应当在十进制表示时每一位上只包含0或者1。你可以假定n不大于200且m不多于100位。 提示&#xff1a;本题采用Special Judge&#xff0c;你无需输出所有符合条件的m&…

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 stl分解_[STL训练]寻梦-题解(Java代码)极简思路

注意事项: insert()方法只能被 StringBuffer 类的对象调用参考代码:import java.util.Scanner;public class Main {private static int n 0;public static void main(String[] args) {Scanner scanner new Scanner(System.in);n scanner.nextInt();int m n * 2;for (int i…

(BFS)Prime Path (poj3126)

题目&#xff1a; 孤单的zydsg又一次孤单的度过了520&#xff0c;不过下一次不会再这样了。zydsg要做些改变&#xff0c;他想去和素数小姐姐约会。 所有的路口都被标号为了一个4位素数&#xff0c;zydsg现在的位置和素数小姐姐的家也是这样&#xff0c;如果两个路口间只差1个数…

java图片资源存放_Java编程中图片文件放哪

举个例子&#xff1a;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;/*按扭类*/classBombextendsJButton{publicintnum_x,num_y;//第几号方块publicintBombRoundCount;//周围雷数...举个例子&#xff1a;import java.awt.*;import java.awt.event.*;import jav…

(BFS)Dungeon Master(poj2251)

题目&#xff1a; 你被困在一个3D地牢中且继续寻找最短路径逃生&#xff01;地牢由立方体单位构成&#xff0c;立方体中不定会充满岩石。向上下前后左右移动一个单位需要一分钟。你不能对角线移动并且迷宫四周坚石环绕。 是否存在逃出生天的可能性&#xff1f;如果存在&#…

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

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

(DFS+DP)滑雪(poj1088)

题目 Michael喜欢滑雪百这并不奇怪&#xff0c; 因为滑雪的确很刺激。可是为了获得速度&#xff0c;滑的区域必须向下倾斜&#xff0c;而且当你滑到坡底&#xff0c;你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数…

(BFS)Meteor Shower (poj3669)

题目&#xff1a; Bessie听说有场史无前例的流星雨即将来临&#xff1b;有谶言&#xff1a;陨星将落&#xff0c;徒留灰烬。为保生机&#xff0c;她誓将找寻安全之所&#xff08;永避星坠之地&#xff09;。目前她正在平面坐标系的原点放牧&#xff0c;打算在群星断其生路前转…

java的整型_java 整型

byte(1字节)、short(2字节)、int(4字节)、long(16字节)java中前缀加上0b或者0b就可以写二进制数&#xff0c;前缀加上0就可以写八进制数&#xff0c;前缀加上0x或者0x就可以写十六进制数一个字节是8位&#xff0c;最高位是符号位&#xff0c;最高位为0则是正数。最高位为1则是负…

(二分+区间搜索 )Mountain Walking(poj2110/poj2922)

题目 农夫约翰和贝西牛已经开始了其中一个“积极”的假期。他们整天都在山里散步&#xff0c;然后在一天结束时&#xff0c;他们厌倦了回到度假小屋。 由于攀爬需要大量能量并且已经疲惫&#xff0c;他们希望使用其最高和最低高度之间的差异最小的路径返回到机舱&#xff0c;…

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

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

(全排列)Smallest Difference (poj2718)

题目&#xff1a; Description - 题目描述 给定若干位十进制数&#xff0c;你可以通过选择一个非空子集并以某种顺序构建一个数。剩余元素可以用相同规则构建第二个数。除非构造的数恰好为0&#xff0c;否则不能以0打头。 举例来说&#xff0c;给定数字0&#xff0c;1&#x…