动态规划 背包问题 找零问题

http://www.360doc.com/content/13/0601/00/8076359_289597587.shtml
http://blog.csdn.net/woshioosm/article/details/7438834

关键在于辅助数组,记录某一个面值(容量)对应的零钱数量(宝石数量),辅助数组后面的值,通过前面的值计算出来

假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大

public
static int maxcount(int[] moneyset,int[] weightset,int target){ //weightset重量 3,4,5 //moneyset价值 4,5,6 //values[] 位置代表容量,值代表最大价值 int[] values = new int[target+1]; int length = values.length; for(int i=0;i<length;i++){ values[i] = 0; } //初始赋值,最开始的三号 int init = weightset[0]; //从三号位开始有价值 values[init] = moneyset[0]; //往每个容量里填价值 for(int i=init+1;i<length;i++){ int maxcount = 0; //循环重量数组, for(int j=0;j<weightset.length;j++){ if(i-weightset[j]>=0){ int temp = values[i-weightset[j]] + moneyset[j]; if(temp>maxcount){ maxcount = temp; } } } values[i] = maxcount; } System.out.println(Arrays.toString(values)); return values[length-1]; }

找零问题
现存在一堆面值为 V1、V2、V3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为 T 个单位的零钱?假设这一堆面值分别为 1、2、5、21、25 元,需要找出总值 T 为 63 元的零钱
public static void getChange(int[] moneyset,int target){
            int[] changes = new int[target+1];
            for(int c:changes){
                c = 0;
            }
            int length = changes.length;
            int init = moneyset[0];
            changes[init]=1;
            for(int i=init+1;i<length;i++){
                int min = Integer.MAX_VALUE;
                
                for(int j=0;j<moneyset.length;j++){
                    if(i==moneyset[j]){
                        min =1 ;
                        break;
                    }else if(i-moneyset[j]>0){
                        int temp = changes[i-moneyset[j]] + 1;
                        if(temp<min){
                            min = temp;
                        }
                    }
                }
                changes[i] = min;
                
            }
            
            System.out.println(Arrays.toString(changes));
            
        }
 
  

 

 

 

转载于:https://www.cnblogs.com/joshsung/p/7419118.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值