算法之动态规划--0、1背包

经典的盗贼问题:
一个盗贼带着一个背包去偷东西,房中有五件物品:
1: 6公斤 48元
2:5公斤 40元
3:2公斤 12元
4:1公斤 8元
5:1公斤 7元
但是他的背包只能装下8攻击的东西 问他该怎样选择保障拿到的东西价值最大。
思路:
使用动态规划来实现,
1.将物品i 放到背包里面,修改选择标志
2.判断是否超重,如果没超重,继续第一步,如果超重,将该物品排除在方案之外,判断此时未排除的物品的总价值是否小于已有最大值;如果满足,则不必再尝试或许物品。
代码:

package 动态规划;


class  This{

    double value;//价值
    double weight;//重量
    char isSelect;//记录是否已经选择了

}
public class Test {
     static double maxvalue;
    static  double totalvalue;
    static double  maxwt;
    static int num;
    static char[] seltemp;

    static void backpack(This[] goods,int i ,double wt,double vt){
        int k;
        if(wt+goods[i].weight <= maxwt){
            seltemp[i]  = 1;
            if(i < num-1){
                backpack(goods,i+1,wt+goods[i].weight,vt);
            }
            else{
                for(k=0;k<num;k++){
                    goods[k].isSelect = seltemp[k];
                }
                maxvalue = vt;
            }
        }
        seltemp[i] = 0;
        if(vt - goods[i].value >maxvalue){
            if(i <num -1){
                backpack(goods , i+1,wt,vt - goods[i].value);
            }
            else{
                for(k = 0;k< num;k++){
                    goods[k].isSelect = seltemp[k];

                }
                maxvalue = vt - goods[i].value;
            }
        }
}
    public static void main(String[] args){
        //test;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值