01背包问题不能用性价比作为选择的标准

如果不是0-1问题的话,当然可以通过比较性价比来做,这时候可考虑用贪心算法;但如果是0-1问题的话就不能单纯“用性价比来做”了,因为有可能背包空出一大块。
  举个简单的例子:一个背包的容量是10KG,
物品A重7KG,价值为14元,
物品B重6KG,价值为11元,
物品C中4KG,价值为7元,
从性价比来看,A最高,但是将A放到背包里以后,无法放进其他物品了,此时总价值为14元;显然,本问题的最佳方案为将B、C放入背包,总价值为18元。

   

这就是0-1背包问题为什么能用动态规划算法,而不能用贪心算法的原因

 

https://iask.sina.com.cn/b/gWjlZJgFdHOT.html

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,背包问题是一个经典的动态规划问题,通常用于优化资源分配。比(通常指的是值/重量比)是一种常见的决策准则,用于确定物品应放入背包还是放弃。以下是使用比来解决0-1背包问题的一个简单示例代码: ```c #include <stdio.h> // 定义物品结构 typedef struct { int weight; // 物品重量 int value; // 物品值 double ratio; // 单位重量的值,即比 } Item; // 动态规划函数,返回最大总值 int knapSack(int W, Item arr[], int n) { int dp[n + 1][W + 1]; // dp[i][j] 表示前i个物品总和能装进容量为j的最大值 // 初始化dp数组 for (int i = 0; i <= n; i++) { dp[i] = 0; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= W; j++) { if (arr[i - 1].weight <= j) { dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - arr[i - 1].weight] + arr[i - 1].value); // 如果物品i能放入,选择放入或不放入 } else { dp[i][j] = dp[i - 1][j]; // 物品i不能放入,直接使用前一个物品的情况 } } } return dp[n][W]; } // 主函数 int main() { int W = 50; // 背包容量 Item items[] = { {10, 60, 6.0}, {20, 100, 5.0}, {30, 120, 4.0} }; // 物品列表 int n = sizeof(items) / sizeof(items); double max_value = knapSack(W, items, n); printf("最大总值: %.2lf\n", max_value); return 0; } ``` 在这个代码中,我们首先定义了一个`Item`结构体,包含了物品的重量、值和比。`knapSack`函数使用了动态规划方法,通过遍历物品并根据比决定是否将当前物品加入背包。最后,在`main`函数中,我们设置了一个简单的背包容量和物品列表,并计算出最大总值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值