自己做的背包算法有问题,求解答

后门的东墙 2019-09-08 12:28:02

public class TestBag {

public static void main(String[] args) {
int props = 4;
int bagCapacity = 10;
int[] weights = {6,5,4,5};//6,5,5,4
int[] values = {20,11,8,10};//20,11,10,8
sort(weights,values,props);
System.out.println(opt(props,bagCapacity,weights,values,props-1));
}

/*这是一个递归方法,该方法递归的选择当前物品要不要选择放入背包,返回的值是当前情况下,选或不选的最大价值
* 参数:props:物品的个数
* bagCapacity:背包剩余容量
* weights:物品重量的数组(代表第i个物品的价值为weights[i])
* values:物品价值的数组(代表第i个物品的价值为values[i])
* thePropNo:当前的物品的序列号(第1个,2个...物品) */
public static int opt(int props,int bagCapacity,int[] weights,int[] values,int thePropNo){

if(bagCapacity<=0){
return 0;
}
if(thePropNo<0 || thePropNo >= props){
return 0;
}
if(thePropNo == 0){
if(weights[0] <= bagCapacity){
return values[0];
}else {
return 0;
}
}

//选当前物品
int a = opt(props,bagCapacity-weights[thePropNo],weights,values,thePropNo-1)+values[thePropNo];

//不选当前物品
int b = opt(props,bagCapacity,weights,values,thePropNo-1);
return Math.max(a,b);
}


/*这是一个排序方法,按照价值的降序排列,最终将对应的质量数组和价值数组按照此规则重排了*/
public static void sort(int[] weights,int[] values,int props){

for (int i = 0; i < props; i++) {
for (int j = 0; j < props-1; j++) {
if(values[j] < values[j+1]){
int tmpW = weights[j];
int tmpV = values[j];
weights[j] = weights[j+1];
values[j] = values[j+1];
weights[j+1] = tmpW;
values[j+1] = tmpV;
}
}
}
}
...全文
180 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
后门的东墙 2019-09-10
  • 打赏
  • 举报
回复
引用
wowpH
顺便给你说声抱歉,当时的情况的确是我不懂规矩,给你说声抱歉!以后我会注意的!
后门的东墙 2019-09-10
  • 打赏
  • 举报
回复
已找到bug,边界判断缺少条件:
 bagCapacity-weights[thePropNo] < 0
。 完整的算法见我博客:https://blog.csdn.net/qq_41419417/article/details/100619704
后门的东墙 2019-09-08
  • 打赏
  • 举报
回复
引用 4 楼 wowpH的回复:
引用 3 楼 qq_41419417 的回复:
我已经发现我的边界问题了,谢谢你的回答!
所以,你做出来了,就要提前在这里说明,不然浪费别人的时间?呵呵
这都能喷一波?大佬大佬!!
wowpH 2019-09-08
  • 打赏
  • 举报
回复
引用 3 楼 qq_41419417 的回复:
我已经发现我的边界问题了,谢谢你的回答!
所以,你做出来了,就要提前在这里说明,不然浪费别人的时间?呵呵
后门的东墙 2019-09-08
  • 打赏
  • 举报
回复
引用 1 楼 wowpH的回复:
选当前物品那一行有问题,如果剩余的空间已经装不下当前物品了,那么,实际上应该是a=0,而你的a=当前物品的价值。
我已经发现我的边界问题了,谢谢你的回答!
wowpH 2019-09-08
  • 打赏
  • 举报
回复
另外,这个好像不需要排序。排序并没用。即使需要排序也应该是升序,毕竟要“贪心”嘛。
wowpH 2019-09-08
  • 打赏
  • 举报
回复
选当前物品那一行有问题,如果剩余的空间已经装不下当前物品了,那么,实际上应该是a=0,而你的a=当前物品的价值。

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧