文档章节

找硬币和背包问题

Cobbage
 Cobbage
发布于 2013/10/03 00:27
字数 743
阅读 28
收藏 0
点赞 0
评论 0
public class Coin {

	
	public static void getCoinMethod(int[]coins,int[] vesult,int money){
		for(int i=1;i<=money;i++){
			int min=i;
			for(int j=1;j<coins.length;j++){
				if(coins[j]<=i){
					int temp=vesult[i-coins[j]]+1;
					if(temp<min)min=temp;
				}
			}	
			vesult[i]=min;
			System.out.println(i+"需要组合个数:"+min);
		}
	}
	public static void main(String[] args) {
		int[]coins=new int[]{0,1,2,3,4,5,10,21,25};
		int money=50;
		int[]vesult=new int[money+1];
		getCoinMethod(coins,vesult,money);
		
		System.out.println("========================");
		
		System.out.println(Arrays.toString(coins));
		for(int i=1;i<=50;i++){
		int[][]result=new int[coins.length][i+1];
		getCoinMethod(coins,result,i);
		}
	}
	
	public static void getCoinMethod(int[]coins,int[][]result,int money){
		//result是一个二维的数组
		//           x标示coin的种类,y标示的结果的大小
		for(int init=1;init<=money;init++){
			result[1][init]=init;
		}
		
		for(int i=2;i<coins.length;i++){
			for(int j=1;j<=money;j++){
				
				result[i][j]=result[i-1][j];
				int count=j/coins[i];
				for(int k=0;k<=count;k++){
				 if(result[i][j]>result[i-1][j-k*coins[i]]+k)
					 result[i][j]=result[i-1][j-k*coins[i]]+k;
				}
			}
			//System.out.println(Arrays.toString(result[i]));
		}
		System.out.println(money+"组合数:");
		for(int n=coins.length-1;n>0;n--){
			int count=money/coins[n];
			if(money>=coins[n]&&result[n][money]==(result[n-1][money-coins[n]*count]+count)){
			    money=money-coins[n]*count;
			    System.out.print(coins[n]+":"+count+"个 +");
			}
		}
		System.out.println();
	}
}

结果的组合可能不是唯一的,转换为动态规划树的问题


public class MinCoins {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        int[] coins={1,3,5};  
        int value=100;  
        int[] solu=new int[value];  
        int min=new MinCoins().solution(coins,value,solu);  
        for(int i=value-1;i>=0;){  
            System.out.print(solu[i]+"->");  
            i=i-solu[i];  
        }  
        System.out.println();  
        System.out.println(min);  
          
    }  
    private int solution(int[] coins,int value, int[] solu){  
        int[] mins = new int[value+1];  
        mins[0]=0;  
        for(int i=1;i<=value;i++) mins[i]=Integer.MAX_VALUE;  
        for(int i=1;i<=value;i++){  
            for(int j=0;j<coins.length;j++){  
                if(coins[j]<=i&&mins[i]>mins[i-coins[j]]+1){  
                    mins[i]=mins[i-coins[j]]+1;  
                    solu[i-1]=coins[j];  
                }  
            }  
        }  
        return mins[value];  
    }  
  
}  
public class BackPack {
    public static void main(String[] args) {
        int m = 10;
        int n = 3;
        int w[] = {3, 4, 5};
        int p[] = {4, 5, 6};
        int c[][] = BackPack_Solution(m, n, w, p);
        for (int i = 1; i <=n; i++) {
            for (int j = 1; j <=m; j++) {
                System.out.print(c[i][j]+"\t");
                if(j==m){
                    System.out.println();
                }
            }
        }
        //printPack(c, w, m, n);

    }

 /**
     * @param m 表示背包的最大容量
     * @param n 表示商品个数
     * @param w 表示商品重量数组
     * @param p 表示商品价值数组
     */
    public static int[][] BackPack_Solution(int m, int n, int[] w, int[] p) {
        //c[i][v]表示前i件物品恰放入一个重量为m的背包可以获得的最大价值
        int c[][] = new int[n + 1][m + 1];
        for (int i = 0; i < n + 1; i++)
            c[i][0] = 0;
        for (int j = 0; j < m + 1; j++)
            c[0][j] = 0;

        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < m + 1; j++) {
                //当物品为i件重量为j时,如果第i件的重量(w[i-1])小于重量j时,c[i][j]为下列两种情况之一:
                //(1)物品i不放入背包中,所以c[i][j]为c[i-1][j]的值
                //(2)物品i放入背包中,则背包剩余重量为j-w[i-1],所以c[i][j]为c[i-1][j-w[i-1]]的值加上当前物品i的价值
                if (w[i - 1] <= j) {
                    if (c[i - 1][j] < (c[i - 1][j - w[i - 1]] + p[i - 1]))
                        c[i][j] = c[i - 1][j - w[i - 1]] + p[i - 1];
                    else
                        c[i][j] = c[i - 1][j];
                } else
                    c[i][j] = c[i - 1][j];
            }
        }
        return c;
    }
}

 

© 著作权归作者所有

共有 人打赏支持
Cobbage

Cobbage

粉丝 46
博文 122
码字总数 65058
作品 0
闵行
QA/测试工程师
贪心算法精讲

一.贪心算法的基本概念 当一个问题具有最优子结构性质时,我们会想到用动态规划法去解它。但有时会有更简单有效的算法。我们来看一个找硬币的例子。假设有四种硬币,它们的面值分别为二角五...

凡平 ⋅ 2011/10/09 ⋅ 0

动态规划之硬币表示问题

问题描述: 有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。 求解思路: 这也是典型的动态规划问题,我们可以这样考虑:当只有1分的硬币时,n从1到n分别有多...

一贱书生 ⋅ 2016/11/22 ⋅ 0

详解动态规划最少硬币找零问题--JavaScript实现

硬币找零问题是动态规划的一个经典问题,其中最少硬币找零是一个变种,本篇将参照上一篇01背包问题的解题思路,来详细讲解一下最少硬币找零问题。如果你需要查看上一篇,可以点击下面链接: ...

YinTokey ⋅ 05/27 ⋅ 0

CCCC 题目集 L3 001 凑零钱 【背包 + 记录路径 + 思维】

传送门 // 题意: 给定n枚硬币的价值, 给出一个容量m, 问能否恰好在这n个中选择一些硬币使得其价值和加起来等于m, 并输出你选择的这些硬币的价值, 如果有多种选择, 输出字典序最小的那种. 思路...

anxdada ⋅ 03/10 ⋅ 0

面试题解| coins in a line iii 区间DP

专栏 | 九章算法 网址 | http://www.jiuzhang.com 题 coins in a line iii 区间DP 题目描述 有 n 个硬币排成一条线,每一枚硬币有不同的价值。两个参赛者轮流从任意一边取一枚硬币,直到没有硬...

九章算法 ⋅ 06/12 ⋅ 0

Algo-Practice: 算法实践(JavaScript & Java),排序,查找、树、两指针、动态规划等

记录一些算法实践 目录 Java篇 一、基础算法 七种基础排序 二叉堆 K选取问题 链表判环问题 N皇后问题 两指针扫描算法举例 位运算(求首个bit1,求bit1的个数,寻找奇数项) 最小栈的实现 横纵有...

qcer ⋅ 2017/12/20 ⋅ 0

USACO3.1Score Inflation(inflate)

这个题和之前做过的一个换硬币的题几乎完全一样,都可以直接套用完全背包问题的解法求解。难道出在这里是想复习一下动态规划?哈哈。 明天开始搞数模了,这倒没什么,放假了,学校周围都没啥...

jzzlee ⋅ 2012/07/06 ⋅ 0

POJ 1742 Coins 【多重背包的应用 + 理解】

传送门 // 题意: 有n中价值的硬币和数量, 问用这些硬币可以构造出1-m中多少个数. 思路: 乍一看就是多重背包的题意, 所以我们用dp[x] 表示x是否可以被表示出来, u[x]保存的是当前这个x使用了多...

anxdada ⋅ 03/06 ⋅ 0

HDU 1114 Piggy-Bank 【求最小值的完全背包】

传送门 // 题意: 给定一个存钱罐的空体积和装满前的体积, 给定n种硬币的价值以及体积, 问能否刚好把存钱罐装满, 并且装满后的存钱罐最少的钱是多少, 其中n种硬币可以用任意次. 思路: 任意次...

anxdada ⋅ 03/10 ⋅ 0

动态规划算法思想解决找零钱问题

动态规划算法思想解决找零钱问题 前言 关于找零钱问题,网上已经有很多相关的资料以及优秀的文章博客等。这里写这篇博客的初衷很简单,就是为了方便自己,回过头来捡起这个知识能快一点,接受...

niaonao ⋅ 2017/10/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 26分钟前 ⋅ 1

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部