贪心法——部分背包问题

 2023-09-07 阅读 12 评论 0

摘要:贪心法——部分背包问题 部分背包问题。有nn个物体,第ii个物体的重量为wiw_i,价值为viv_i。在总重量不超过CC的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。 和最优转载问题一样,这题也可以用贪心法解决。但是这题有两个因素,重量和

贪心法——部分背包问题

部分背包问题。有n个物体,第i个物体的重量为wi,价值为vi。在总重量不超过C的情况下让总价值尽量高。每一个物体都可以只取走一部分,价值和重量按比例计算。

和最优转载问题一样,这题也可以用贪心法解决。但是这题有两个因素,重量和价值,所以应该综合考虑两个因素。

直观的贪心策略是:优先拿性价比高的,也就是viwi大的,直到重量恰好为C

由于可以拿部分,因此一定能保证重量恰好为C(除非n个物体总重量不足C),并且除了拿的最后一个物体可能是拿部分以外,其他拿的都是拿整个。

部分背包问题算法实现

// 物体类型
struct Matter {// 重量float w;// 价值float v;// 从大到小排序bool operator < (const Matter &m) const {return (v / w) > (m.v / m.w);}
};// 贪心法
// 部分背包问题
void optionalLoad(Matter *m, int n, float C) {sort(m, m + n);float retain = C;float sumValue = 0;int i;for(i = 0; i < n; i++) {if(m[i].w <= retain) {cout << "第" << i + 1 << "个放入背包的重量为:" << m[i].w << "\t价值为:" << m[i].v << endl;retain -= m[i].w;sumValue += m[i].v;} else {if(retain != 0) {// 最后一个能放入重量的价值float retainValue = m[i].v / m[i].w * retain;cout << "第" << i + 1 << "个放入背包的重量为:" << retain << "\t价值为:" << retainValue << endl;sumValue += retainValue;}break;}}cout << "总价值为:" << sumValue << endl << endl;
}

测试主程序

#include <iostream>
#include <algorithm>using namespace std;// 物体类型
struct Matter {// 重量float w;// 价值float v;// 从大到小排序bool operator < (const Matter &m) const {return (v / w) > (m.v / m.w);}
};// 贪心法
// 部分背包问题
void optionalLoad(Matter *m, int n, float C) {sort(m, m + n);float retain = C;float sumValue = 0;int i;for(i = 0; i < n; i++) {if(m[i].w <= retain) {cout << "第" << i + 1 << "个放入背包的重量为:" << m[i].w << "\t价值为:" << m[i].v << endl;retain -= m[i].w;sumValue += m[i].v;} else {if(retain != 0) {// 最后一个能放入重量的价值float retainValue = m[i].v / m[i].w * retain;cout << "第" << i + 1 << "个放入背包的重量为:" << retain << "\t价值为:" << retainValue << endl;sumValue += retainValue;}break;}}cout << "总价值为:" << sumValue << endl << endl;
}int main() {while(true) {// n个物体int n;cout << "请输入物体总数(0退出):";cin >> n;if(!n) {break;}float C;cout << "请输入不超过的总重量:";cin >> C;Matter m[n];for(int i = 0; i < n; i++) {cout << "第" << i + 1 << "个物体的重量、价值分别为:";cin >> m[i].w;cin >> m[i].v;}//cout << "总价值最高的组合和价值为:" << endl;optionalLoad(m, n, C);}return 0;
}

输出数据

请输入物体总数(0退出):5
请输入不超过的总重量:101个物体的重量、价值分别为:3 92个物体的重量、价值分别为:9 33个物体的重量、价值分别为:2 44个物体的重量、价值分别为:4 25个物体的重量、价值分别为:1 1
总价值最高的组合和价值为:
第1个放入背包的重量为:3        价值为:92个放入背包的重量为:2        价值为:43个放入背包的重量为:1        价值为:14个放入背包的重量为:4        价值为:2
总价值为:16请输入物体总数(0退出):5
请输入不超过的总重量:101个物体的重量、价值分别为:2 32个物体的重量、价值分别为:3 23个物体的重量、价值分别为:6 14个物体的重量、价值分别为:4 45个物体的重量、价值分别为:5 1
总价值最高的组合和价值为:
第1个放入背包的重量为:2        价值为:32个放入背包的重量为:4        价值为:43个放入背包的重量为:3        价值为:24个放入背包的重量为:1        价值为:0.2
总价值为:9.2请输入物体总数(0退出):3
请输入不超过的总重量:9.21个物体的重量、价值分别为:1 12个物体的重量、价值分别为:2 23个物体的重量、价值分别为:3 3
总价值最高的组合和价值为:
第1个放入背包的重量为:1        价值为:12个放入背包的重量为:2        价值为:23个放入背包的重量为:3        价值为:3
总价值为:6请输入物体总数(0退出):0Process returned 0 (0x0)   execution time : 921.488 s
Press any key to continue.

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/14956.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息