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

子问题定义:定义一个数组b,大小比兑换价格的大小多一个元素,其中b[i]表示是否能用面值为x1,x2,x3,..,xn的硬币兑换价格i。

递归关系:

初值设定:设b[0]=true

求解顺序:按下标从小到大依次求解b[i]的值,最后返回b[v]中的结果即为最终结果。

 1 package org.xiu68.ch06.ex7;
 2
 3 public class Ex6_17 {
 4
 5     //数量无限的面值为x1,x2,x3,...,xn的硬币是否能兑换价格v
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         int[] coin=new int[]{5,6};
 9         for(int i=0;i<=30;i++)
10             convertChange(coin,i);
11     }
12
13     //coin:硬币面值
14     //v:要兑换的价格
15     public static void convertChange(int[] x,int v){
16         boolean b[]=new boolean[v+1];    //能否用硬币兑换价格v
17         b[0]=true;
18
19         for(int i=1;i<=v;i++){            //能否用硬币兑换价格i (子问题的规模)
20             for(int j=0;j<x.length;j++){
21                 if(i>=x[j] && b[i-x[j]]==true){
22                     b[i]=true;
23                     break;
24                 }else{
25                     b[i]=false;
26                 }
27             }
28         }
29         System.out.println(v+":"+b[v]);
30     }
31
32     //运行结果
33 /*    0:true
34     1:false
35     2:false
36     3:false
37     4:false
38     5:true
39     6:true
40     7:false
41     8:false
42     9:false
43     10:true
44     11:true
45     12:true
46     13:false
47     14:false
48     15:true
49     16:true
50     17:true
51     18:true
52     19:false
53     20:true
54     21:true
55     22:true
56     23:true
57     24:true
58     25:true
59     26:true
60     27:true
61     28:true
62     29:true
63     30:true*/
64 }

时间: 2024-08-30 04:09:55

Ex 6_17 数量无限的硬币兑换问题_第七次作业的相关文章

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的右下角元素值即为最终的解. 1 package org.xiu68.ch06.ex7; 2 3 public class Ex6_18 { 4 5 //面值为x1,x2,x3,.

C++实现最少硬币兑换问题

最少硬币兑换问题 #include<iostream> #include<fstream> using namespace std; int n,L; //n种硬币L长的数组 int c[13][20]; int T[13];//硬币面值 int jisuan(int i,int j); int main() { fstream file("2.1_input.txt"); //这是需要读取数据的文件的路径. fstream file2("2.1_ou

找零问题

问题描述: 为找零问题 设计一种动态规划算法:给定金额n以及各种面额d1,d2,...,dm的数量无限的硬币,求总金额等于n的硬币的最少个数,或者指出该问题无解. (对于该问题可以用动态规划方法或者贪婪法求解,但贪婪法要注意如何说明局部最优可以保证全局最优) 思路:  各种硬币的面额为 d[1,2,3,..N],设C[i,j]为在前i种面额中求总面值为j的最优解(最少硬币数). 初始化 C[i,j] = 正无穷 (i=0, j>=1 && j<=N) c[i,j] = 0(i&

[BZOJ 1042][HAOI 2008]硬币购物(背包+容斥原理)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1042 刚开始搞容斥原理,还很有点吃力,我太弱了... 首先用被类似于背包的DP进行预处理,假设每种硬币个数无限制,求出f[i]=凑出面值i的方案总数. 但是实际上题目中每种硬币个数是有限制的,设四种硬币分别是a.b.c.d,则凑出面值S的方案中超出限制的方案数=a超出限制的方案数+b超出限制的方案数+c超出限制的方案数+d超出限制的方案数-a和b都超出限制的方案数-a和c都超出限

硬币找零&&爬楼梯&&猴子摘香蕉

硬币找零&&爬楼梯&&猴子摘香蕉 假设有几种硬币,如1.3.5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. #include"CoinProblem.h" #include<iostream> int countNum=MAX; void CoinProblem(int *coin,int Length,int Value,int count){ if(Value==0){ if(countNum>count){ c

动态规划-硬币找零

问题描述: 假设有几种硬币,如1,2,5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. 问题分析: 用待找零的数值n,描述子结构/状态,记作sum[n],其值为所需的最小硬币数. 对于不同的硬币面值coin[0...T],有sum[k] = min0<=j<T{sum[k-coin[j]]}+1. 对应于给定数目的找零N,需要求解sum[N]的值. 类似于算法导论的钢条切割问题. def coinss(N): import sys opt=[sys.maxsize]*(N+1

笔试题:硬币划分

硬币划分 问题描述: 有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n <= 100000),有多少中组合可以组成n分钱? 思路分析: 穷举法 int countWays(int n) { int count = 1; // 全用1分的情况 for(int a1 = 0; a1 < n/10; a1++) { int b1 = 10 * a1; for(int a2 = 0; a2 <= n/5; a2++) { int b2 = 5* a2; for(int a3=

硬币划分

热度指数:1598 时间限制:1秒 空间限制:65536K 算法知识视频讲解 有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n <= 100000),有多少中组合可以组成n分钱? 输入描述: 输入整数n.(1<=n<=100000) 输出描述: 输出组合数,答案对1e9+7取模. 示例1 输入 13 输出 16 通俗的讲下: 举个例子:{1,2,5,10},当1 2 遍历完后 那么开始遍历5时整个dp数组已经完成了对仅对1 2进行分配的种类,但并没有开始以5开始,比如

挑战程序设计竞赛2.2习题:Allowance POJ - 3040

Allowance As a reward for record milk production, Farmer John has decided to start paying Bessie the cow a small weekly allowance. FJ has a set of coins in N (1 <= N <= 20) different denominations, where each denomination of coin evenly divides the