经典的盗贼问题:
一个盗贼带着一个背包去偷东西,房中有五件物品:
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;
}
}