Ex 6_18 硬币有限的兑换问题_第七次作业

子问题定义: 定义一个二维数组b,其中b[i][j]表示前i个币种是否能兑换价格j,表示第i个币种的面值,第i个币种的使用有两种情况,若使用,则b[i][j]=b[i-1][j-],若不使用,则b[i][j]=b[i-1][j]
递归关系:

初值设定:

求解顺序:
按下标从小到大依次求解数组b每一行的值,最后二维数组b的右下角元素值即为最终的解。
package org.xiu68.ch06.ex7;
public class Ex6_18 {
//面值为x1,x2,x3,...,xn的硬币是否能兑换价格v,每个硬币只能使用一次(解法有点类似于0-1背包问题)
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] x=new int[]{1,3,5,6};
for(int i=0;i<=20;i++)
convertChange(x, i);
}
//coin:硬币面值
//v:要兑换的价格
public static void convertChange(int[] x,int v){
boolean[][] b=new boolean[x.length+1][v+1]; //b[i][j]表示使用前i个币种是否能兑换价格j
for(int i=0;i<=x.length;i++)
b[i][0]=true; //表示任何币种可以兑换价格0
for(int j=1;j<=v;j++)
b[0][j]=false; //没有硬币则不可以兑换任何大于0的价格
for(int i=1;i<=x.length;i++){
for(int j=1;j<=v;j++){
boolean use=false;
if(j>=x[i-1]) //价格j要大于等于第i个币种才能用第i个币种兑换
use=b[i-1][j-x[i-1]]; //使用第i个币种的情况 ,x[i-1]:第i个币种下标为i-1
boolean nuse=b[i-1][j]; //不使用第i个硬币的情况
if(use || nuse) //只要有一种情况可以兑换则前i个币种能兑换价格j
b[i][j]=true;
else
b[i][j]=false;
}//for2
}//for1
System.out.print(v+":"+b[x.length][v]);
if(b[x.length][v]){
System.out.print(" use: ");
for(int i=x.length,j=v;i>0 && j>0;){
if(j>=x[i-1] && b[i-1][j-x[i-1]]){ //使用了第i个币种
System.out.print(x[i-1]+" ");
j=j-x[i-1];
i--;
}else{ //没有使用第i个币种
i--;
}
}//for
}
System.out.println();
}
//运行结果:
/*0:true use:
1:true use: 1
2:false
3:true use: 3
4:true use: 3 1
5:true use: 5
6:true use: 6
7:true use: 6 1
8:true use: 5 3
9:true use: 6 3
10:true use: 6 3 1
11:true use: 6 5
12:true use: 6 5 1
13:false
14:true use: 6 5 3
15:true use: 6 5 3 1
16:false
17:false
18:false
19:false
20:false*/
}
Ex 6_18 硬币有限的兑换问题_第七次作业的更多相关文章
- Ex 6_17 数量无限的硬币兑换问题_第七次作业
子问题定义:定义一个数组b,大小比兑换价格的大小多一个元素,其中b[i]表示是否能用面值为x1,x2,x3,..,xn的硬币兑换价格i. 递归关系: 初值设定:设b[0]=true 求解顺序:按下标从 ...
- Ex 6_19 至多用k枚硬币兑换价格_第七次作业
子问题定义: 定义一个二维数组b,其中b[i][j]表示用i个硬币是否能兑换价格j,表示第i个币种的面值, 递归关系: 初值设定: 求解顺序: 按下标从小到大依次求解数组b每一列的值,最后二维数组b的 ...
- Ex 6_26 序列对齐..._第七次作业
- Ex 6_23 一个生产系统共包含n个顺序执行的阶段..._第七次作业
- Ex 6_16 旧货销售问题_第七次作业
即可 子问题定义:定义数组B(S,j),其中 B(S,j)表示在子集S中结束位置为j的子问题的最大收益值,其中j的前一个地点有两种情况,第一种情况是某个拍卖会 另一种情况是从家里出发. 递归关系: 初 ...
- ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 G ...
- 钱币兑换问题_完全背包&&拆分&&母函数
ps:原来用新浪,可是代码的排版不是很好,所以用博客园啦,先容许我把从八月份开始的代码搬过来,从这里重新出发,希望这里可以一直见证我的成长. Time Limit: 2000/1000 MS (Jav ...
- 网易云课堂_C语言程序设计进阶_第七周:文件:文件访问、格式化输入输出、二进制输入输出
7.1文件 7.2底层操作 7.1文件 格式化的输入输出 printf %[flags][width][.prec][hIL]type Flag 含义 - 左对齐 + 在前面放+或- (space) ...
- .Net基础篇_学习笔记_第七天_随机数的产生
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
随机推荐
- mod(%)之规律(除数与被除数的正负分析)
首先注意“-9 % 4”,根据运算符优先级,负号运算符优先级大于余数(取模),所以执行的是“(-9) % 4”. 其次 % = mod ,只是在不同地方表示方法不同而已. 被除数无论是正数和负数结果都 ...
- Java设计模式--缺省适配器模式
我认为这个模式比较常见,还记得我们学习Swing的时候吗,有没有见过很多Adapter?那时候不知道Adapter的意义所在,但至少知道他能够省去我们不需要的实现. 这个社会有N中职业(job),但是 ...
- Java如何实现跨平台
在前面讲解编程语言的时候我们看到,通过引入编译器,解决了使用机器语言编程带来的问题.但这有待来了另一个问题:不同的平台(你可以理解成CPU不同.操作系统不同)所能理解的二进制机器指令是不一样的,编译器 ...
- 困惑2----(已经OK)
题目: 运行结果:以及图示分析 源代码: package com.mon11.day18; /** * 类说明 : * @author 作者 :chenyanlong * @version 创建时间: ...
- Harbor镜像迁移
目录 背景说明 方案实现 背景说明 在早期生产环境尝试使用docker的时候,虽然使用了harbor作为镜像仓库,但是并没有做好相关存储规划,所有的镜像都直接存储到了harbor本地.随着业务发展,本 ...
- golang格式化输出-fmt包用法详解
golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org 声明: 此片文章并非原创,大多数内容都是来自:https:// ...
- bzoj千题计划302:bzoj3160: 万径人踪灭
https://www.lydsy.com/JudgeOnline/problem.php?id=3160 不连续的回文串数量=所有的回文序列数量-连续的回文子串 连续的回文子串: manacher ...
- ueditor 百度编辑器,自定义右键菜单
如图:有2种自定义方法,一种是改源码,一种是初始化 初始化,如下代码: var ue = UE.getEditor('XXXid',{ // contextMenu:[ {label:'', cmdN ...
- 二、编译第一步 make xxx_defconfig
2.1 顶层make defconfig规则 make xxx_defconfig 的执行主要分成三个部分: 执行 make -f ./scripts/Makefile.build obj=scrip ...
- caffe 中 python 数据层
caffe中大多数层用C++写成. 但是对于自己数据的输入要写对应的输入层,比如你要去图像中的一部分,不能用LMDB,或者你的label 需要特殊的标记. 这时候就需要用python 写一个输入层. ...