子问题定义: 定义一个二维数组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 硬币有限的兑换问题_第七次作业的更多相关文章

  1. Ex 6_17 数量无限的硬币兑换问题_第七次作业

    子问题定义:定义一个数组b,大小比兑换价格的大小多一个元素,其中b[i]表示是否能用面值为x1,x2,x3,..,xn的硬币兑换价格i. 递归关系: 初值设定:设b[0]=true 求解顺序:按下标从 ...

  2. Ex 6_19 至多用k枚硬币兑换价格_第七次作业

    子问题定义: 定义一个二维数组b,其中b[i][j]表示用i个硬币是否能兑换价格j,表示第i个币种的面值, 递归关系: 初值设定: 求解顺序: 按下标从小到大依次求解数组b每一列的值,最后二维数组b的 ...

  3. Ex 6_26 序列对齐..._第七次作业

  4. Ex 6_23 一个生产系统共包含n个顺序执行的阶段..._第七次作业

  5. Ex 6_16 旧货销售问题_第七次作业

    即可 子问题定义:定义数组B(S,j),其中 B(S,j)表示在子集S中结束位置为j的子问题的最大收益值,其中j的前一个地点有两种情况,第一种情况是某个拍卖会 另一种情况是从家里出发. 递归关系: 初 ...

  6. ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第七章_使用ArcGIS进行空间分析 - ArcGIS知乎-新一代ArcGIS问答社区 1 使用ArcGIS进行空间分析 1.1 GIS分析基础 G ...

  7. 钱币兑换问题_完全背包&&拆分&&母函数

    ps:原来用新浪,可是代码的排版不是很好,所以用博客园啦,先容许我把从八月份开始的代码搬过来,从这里重新出发,希望这里可以一直见证我的成长. Time Limit: 2000/1000 MS (Jav ...

  8. 网易云课堂_C语言程序设计进阶_第七周:文件:文件访问、格式化输入输出、二进制输入输出

    7.1文件 7.2底层操作 7.1文件 格式化的输入输出 printf %[flags][width][.prec][hIL]type Flag 含义 - 左对齐 + 在前面放+或- (space) ...

  9. .Net基础篇_学习笔记_第七天_随机数的产生

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. 【模板】Tarjan scc缩点

    代码如下 #include <bits/stdc++.h> using namespace std; const int maxv=1e4+10; const int maxe=1e5+1 ...

  2. [Offer收割]编程练习赛13 解题报告

    http://hihocoder.com/contest/offers13/problems 题目1 : 风格不统一如何写程序 首先:输入保证组成变量名的单词只包含小写字母. 做法:只要对不同的部分进 ...

  3. GO语言的进阶之路-初探GO语言

    GO语言的进阶之路-初探GO语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么我们需要一门新语言 Go语言官方自称,之所以开发Go 语言,是因为“近10年来开发程序之难 ...

  4. MYCAT扩容

    一.原架构图: 二.扩容 在HOST1上新增节点db_user2 在HOST2上新增节点db_user2 三.操作步骤 1.mycat 所在环境安装 mysql 客户端程序 2.mycat 的 lib ...

  5. 标准遗传算法(实数编码 python实现)模拟二进制交叉SBX 多项式变异

    代码地址: https://github.com/guojun007/real_sga 本部分是采用实数编码的标准遗传算法,整体流程与上一篇二进制编码的基本一致, 主要区别在于本部分的交叉操作为模拟二 ...

  6. php循环删除文件夹和目录

    一定要注意文件夹中的两个目录---->   .(当前目录)  ..(上级目录) 需要对这两个目录进行过滤, 否则在删除或者遍历是会一直,对于..甚至会向你指定的文件夹的上级目录循环操作,删除重要 ...

  7. QT_地图导航 源码下载

    https://github.com/douzujun/MyMapView 主要算法讲解: 1. 计算最短路径(dijkstra算法) Step1: (1)找到最短路径已经确定的顶点,从它已经确定的顶 ...

  8. .NET面试题系列(十三)Lucene底层原理

    索引原理 全文检索技术由来已久,绝大多数都基于倒排索引来做,曾经也有过一些其他方案如文件指纹.倒排索引,顾名思义,它相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成 ...

  9. Tomcat 配置目录

    TOMCAT 1.主目录下有bin,conf,lib,logs,temp,webapps,work 1.bin目录主要是用来存放tomcat的命令 2.conf目录主要是用来存放tomcat的一些配置 ...

  10. Java SE之浅谈JDK SDK JRE

    JDK(Java Development Kit):   1.定义:编写Java程序的程序员使用的软件开发工具包,又被称为Java SDK (Java Software Development Kit ...