01背包回溯法java_用回溯算法求解0-1背包问题

本文介绍了如何运用回溯算法解决0-1背包问题。在0-1背包问题中,我们有一个背包,最大装载量为W,包含n个不同重量的物品,物品不可分割,目标是找到能装入背包的最大重量。通过递归函数实现,枚举所有可能的物品组合,排除超重情况,找到背包能容纳的最大重量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打个比喻,我们的人生会面临无数的选择,我们每次选择的时候都会选择自己任务的最优解,但最终的结果并不一定是最优解,可能面临抉择的选择了贪图小利,最终一生碌碌无为。上面求最优解的方式就是贪心算法,为什么这时候贪心算法不好用了,就是因为我们的每次选择都是有关联的,我们的这次决定会影响我们今后的选择。所以这时候贪心算法不好用了,那么如果我们能吃后悔药,回头看看我们可选择的所有情况,然后就可以从所有情况中选择最优解。这就是回溯算法思想。

0-1背包问题。

我们有一个背包,最大的装载量为W,有n个重量不一样的物体,且物体不可分割,求背包能装载的最大重量。代码如下

int maxW = 0;

/**

0-1背包问题

@param i 当前遍历到的位置

@param cw 当前书包总重量

@param items 物品重量集合

@param n 总物品的数量

@param w 书包可以承受的最大重量

*/

void f(int i, int cw, int* items, int n, int w){

// printf("i:%d cw:%d\n",i,cw);

//终止条件,当前物品总质量等于背包可以承受的最大质量

if (cw == w || i == n){

//更新背包可以承受的最大质量

printf("i:%d cw:%d\n",i,cw);

if (cw > maxW) maxW = cw;

return;

}

f(i+1, cw, items, n, w);

if (cw + items[i] <= w){

f(i+1, cw+items[i], items, n, w);

}

}

int main(int argc, const char * argv[]) {

int a[8] = {23,12,2,56,121,33,5,1};

f(0, 0, a, 8, 100);

printf("最大质量:%d",maxW);

// insert code here...

printf("Hello, World!\n");

return 0;

}

代码很见到,但是理解起来有点困难,首先我们的思路是枚举所有的情况,并且排除超重情况、

或许先把判断去掉更好理解一点,一个物品就两种情况装或者不装,遍历所有情况,更新最大值。

if (i == n){

if (cw > maxW) maxW = cw;

return;

}

f(i+1, cw, items, n, w);

f(i+1, cw+items[i], items, n, w);

判断是为了去除超重情况,然后加上判断再理解一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值