java动态规划取硬币问题
最近一直在研究动态规划的问题。今天遇到了取硬币问题。
其实动态规划还是,我从底部向顶部,依次求出每个状态的最小值,然后就可以标记上。
这道题目就是,假如有1,5,7,10这四种币值的硬币,我取14元,取的硬币数最少要多少张。
其实动态规划就是要求出状态转移方程,就好比我的上一个博客的求最短路径的问题。而这道取硬币问题呢。如果我的硬币大于有的币值,那么就能状态转移
转移为temp[i-weizhi[j] + 1。temp[]是用来存放每种币值的最小数目。weizhi[]是用来存放币值。比如说吧,temp[0]表示取0个币值要0次,temp[1] 中1只大于1,所以能取1枚硬币。那么转换成temp[1-1]+1,取1次
temp[2]呢,2也是只大于1,那么转化成temp[2-1]+1......到temp[5]就不一样了,temp[5]中的5大于1,所以可以取temp[5-1]+1 = 5 ,而也可以取temp[5-5]+1 = temp[0]+1 = 0+1 = 1。照这种思想完全可以编出代码来了。但是这里涉及到一个问题,我每次都需要比较我最小的一个,这时候直接用变量来存放就行了,千万别习惯性的想用数组,我开始就是想用数组,但是还越界了,下面是我的代码,其实那个for循环就是动态规划的核心。可以理解为填数字吧。今天这么晚了,明天给大家更新填数字的代码。
import java.util.Scanner;
public class 找零钱 {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
System.out.println("请输入想计算多少枚硬币:");
int n = scn.nextInt();
int temp[] = new int[n+1]; //存放每种硬币取的最少的取法
int weizhi[] = {1,5,7,10}; //四种硬币
//动态规划的核心,用for循环去填充每次能标记上的
for(int i=1;i<temp.length;i++) { //取的硬币的数量
int minV = i; //初始化最小的为minV,因为最小取的硬币数量肯定不会比i还要大
for(int j=0;j<weizhi.length;j++) {
if(i>=weizhi[j]) { //取的硬币的数目比有的数目要大。
int k = temp[i-weizhi[j]] + 1; //状态转移方程,前面介绍的。
if(k<minV) {
minV = k; //保存了,这一趟比较的最小的取的硬币值
}
}
}
temp[i] = minV;
}
System.out.println("至少需要" + temp[n] + "枚硬币");
}
}
java动态规划取硬币问题的更多相关文章
- java动态规划导弹问题
这是一道动态规划题,和昨天的取硬币还有最长公共字串有点类似. 1.题目描述: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一 ...
- java 抓取网页图片
import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Out ...
- Java中取小数点后两位(四种方法)
摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法) 一 Long是长整型,怎么有小数,是double吧 java.text.D ...
- java大数取余
java大数取余: 类方法:BigInteger.divideAndRemainder() 返回一个数组,key = 0为商key = 1为余数 import java.util.*; import ...
- Java Byte取值范围
Java Byte 的取值范围大家都知道(-128 ~ 127),那么-128 和 127 这两个数是怎么计算的呢? #大学知识回顾: 概念:负数的补码是该 数 绝 对 值 的 原 码 按 位 取 反 ...
- MinerHtmlThread.java 爬取页面线程
MinerHtmlThread.java 爬取页面线程 package com.iteye.injavawetrust.miner; import org.apache.commons.logging ...
- MinerConfig.java 爬取配置类
MinerConfig.java 爬取配置类 package com.iteye.injavawetrust.miner; import java.util.List; /** * 爬取配置类 * @ ...
- Java爬取网络博客文章
前言 近期本人在某云上购买了个人域名,本想着以后购买与服务器搭建自己的个人网站,由于需要筹备的太多,暂时先搁置了,想着先借用GitHub Pages搭建一个静态的站,搭建的过程其实也曲折,主要是域名地 ...
- Java爬取校内论坛新帖
Java爬取校内论坛新帖 为了保持消息灵通,博主没事会上上校内论坛看看新帖,作为爬虫爱好者,博主萌生了写个爬虫自动下载的想法. 嗯,这次就选Java. 第三方库准备 Jsoup Jsoup是一款比较好 ...
随机推荐
- c/c++程序设计涉及的一些知识点
c/c++程序设计涉及的一些知识点 c中的printf函数 main(){ int b = 3; int arr[]= {6,7,8,9,10}; int * ptr = arr; *(ptr++) ...
- 嵌入式视频采集编程思路(Video 4 Linux)-转
转自:http://zyg0227.blog.51cto.com/1043164/271954 1. linux 内核有video for linux简称V4L.V4L是Linux影像系统与嵌入式影 ...
- 骰子点数概率__dp
骰子点数概率 时间限制:1 秒 内存限制:32 兆 题目描述: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入n,打印出S的所有可能的值出现的概率. 输入: 输入包括一个整数N(1<= ...
- jeecg中List页面的高级查询
1.普通的高级查询 <t:datagrid name="orderworthList" title="订单价值统计" actionUrl="or ...
- PPP PDP 及GPRS
1.相关概念: PDP:Packet Data Protocol 分组数据协议 PLMN:Public Land Mobile Network,公共陆地移动网络 APN:Access Point Na ...
- android 手机UDP 接受不到数据
一.有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了. 1.可先在oncreate()方法里面实例化一个WifiManager.MulticastLock 对象lock ...
- JDK 9 & JDK 10 新特性
JDK 9 新增了不少特性,官方文档:https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-527735CF-44E1-4144-9 ...
- Redis:目录
ylbtech-Redis:目录 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 ...
- es6 一些小知识
本人最近被es6感兴趣了,学习一些,以下就是自己总结的一些小知识 1.当你在百度输入"es6"关键字,点击进入es6入门,首先你需要知道怎样学习的顺序,先看第21章Module语法 ...
- Repeater,ItemDataBound事件,获取绑定列的值,给指定列添加js方法
protected void rp_bf_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ...