n个物品有重量W={w1,…,wn}和价值P={p1,…,pn}, 有一容量为C的背包(其中wi ,pI, CZ+)。如何选择物品装入背包,是装入物品的价值最大? 要求: 1)编写算法,按单位重量的价值由大到小排序,重新编号。 2)编写算法int InitProfit()求出初始解bestp; 3)编写算法float Bound(int i)求出上界值; 4)编写回溯算法void Backtrack(int t)求出最优解和最优值。 5)实例:n=11, wi随机产生,范围1~20;pi随机产生,范围10~30;C等于所有物品重量和的4/5(取整数)。编写程序,将结果打印到文件(Knapsack.txt)。C语言实现

时间: 2024-03-21 19:42:05 浏览: 20
以下是使用C语言实现的完整代码,包括排序算法、初始解算法、上界计算算法和回溯算法,以及主函数用于生成随机数据和输出结果到文件中。 ```C #include <stdio.h> #include <stdlib.h> #include <time.h> void sortItems(int n, int int w[], int p[], int v[], int id[]); int InitProfit(int n, int w[], int p[], int C); float Bound(int i, int n, int w[], int p[], int C, int profit); void Backtrack(int t, int n, int w[], int p[], int C, int id[], int x[], int &bestp, int bestx[]); int main() { int n = 11; int w[n + 1]; int p[n + 1]; int v[n + 1]; int id[n + 1]; int C, bestp = 0; int bestx[n + 1]; int x[n + 1]; // 生成随机数据 srand((unsigned) time(NULL)); for (int i = 1; i <= n; i++) { w[i] = rand() % 20 + 1; p[i] = rand() % 21 + 10; } C = 4 * (w[1] + w[2] + w[3] + w[4] + w[5]) / 5; // 排序 sortItems(n, w, p, v, id); // 求初始解 bestp = InitProfit(n, w, p, C); // 回溯搜索 Backtrack(1, n, w, p, C, id, x, bestp, bestx); // 输出结果到文件 FILE *fp; fp = fopen("Knapsack.txt", "w+"); fprintf(fp, "n = %d, C = %d\n", n, C); fprintf(fp, "w = {"); for (int i = 1; i <= n; i++) { fprintf(fp, "%d", w[i]); if (i < n) { fprintf(fp, ", "); } } fprintf(fp, "}\n"); fprintf(fp, "p = {"); for (int i = 1; i <= n; i++) { fprintf(fp, "%d", p[i]); if (i < n) { fprintf(fp, ", "); } } fprintf(fp, "}\n"); fprintf(fp, "bestp = %d\n", bestp); fprintf(fp, "bestx = {"); for (int i = 1; i <= n; i++) { fprintf(fp, "%d", bestx[i]); if (i < n) { fprintf(fp, ", "); } } fprintf(fp, "}\n"); fclose(fp); return 0; } void sortItems(int n, int w[], int p[], int v[], int id[]) { for (int i = 1; i <= n; i++) { v[i] = p[i] / w[i]; id[i] = i; } for (int i = 1; i < n; i++) { for (int j = i + 1; j <= n; j++) { if (v[i] < v[j] || (v[i] == v[j] && id[i] > id[j])) { int temp = v[i]; v[i] = v[j]; v[j] = temp; temp = w[i]; w[i] = w[j]; w[j] = temp; temp = p[i]; p[i] = p[j]; p[j] = temp; temp = id[i]; id[i] = id[j]; id[j] = temp; } } } } int InitProfit(int n, int w[], int p[], int C) { int profit = 0, weight = 0; for (int i = 1; i <= n; i++) { if (weight + w[i] <= C) { weight += w[i]; profit += p[i]; } else { profit += (C - weight) * p[i] / w[i]; break; } } return profit; } float Bound(int i, int n, int w[], int p[], int C, int profit) { float bound = profit; int weight = 0; for (int j = i; j <= n; j++) { if (weight + w[j] <= C) { weight += w[j]; bound += p[j]; } else { bound += (C - weight) * p[j] / w[j]; break; } } return bound; } void Backtrack(int t, int n, int w[], int p[], int C, int id[], int x[], int &bestp, int bestx[]) { if (t > n) { if (bestp < x[0]) { bestp = x[0]; for (int i = 0; i <= n; i++) { bestx[i] = x[i]; } } return; } if (x[0] + Bound(t, n, w, p, C, x[0]) <= bestp) { return; } x[t] = 1; int weight = 0; int profit = 0; for (int i = 1; i <= t; i++) { if (x[i] == 1) { weight += w[id[i]]; profit += p[id[i]]; } } if (weight <= C) { Backtrack(t + 1, n, w, p, C, id, x, bestp, bestx); } x[t] = 0; Backtrack(t + 1, n, w, p, C, id, x, bestp, bestx); } ```

相关推荐

最新推荐

recommend-type

Bootstrap 模板.md

一些常用的 Bootstrap 模板示例,你可以根据自己的需求选择合适的模板,并进行定制以满足项目需求。Bootstrap 提供了丰富的组件和样式,可以帮助你快速搭建漂亮的网站和 Web 应用程序。 markdown文本,请使用vscode等代码编辑器查看!!!
recommend-type

工地试验室人员统计表.docx

工地试验室人员统计表.docx
recommend-type

安卓音乐播放器应用及其源代码+使用说明(毕设参考)

安卓音乐播放器应用及其源代码 概述 安卓音乐播放器应用是一款全能型音乐播放器,允许你在安卓设备上听自己的所有歌曲,并且可以免费流播。需要明确的是,这些免费歌曲绝不是非法的。它们是你可以在任何地方免费聆听的歌曲。 安卓音乐播放器让用户可以从自己的音乐库中选择想要播放的歌曲,然后在手机上播放。当你离开用户界面时,音乐不会停止。在你能做到这一点之前,你的电脑上需要安装一些东西。这样当你启动应用时,它会从你的设备中选择歌曲并播放。 音乐播放器让你可以快速轻松地管理和移动所有音乐文件。这个播放器可以播放大多数类型的mp3、midi、wav、flac raw和aac文件。它还可以播放其他类型的音频文件。音乐可以按照类型、专辑、艺术家、歌曲和文件夹进行分类,以便你可以快速找到想要的内容。 安卓音乐播放器:项目详情与技术 项目标题:安卓音乐播放器源代码 摘要:安卓音乐播放器应用让你以多种方式管理和播放你的数字音乐。 项目类型:移动应用 技术:Android Studio 数据库:SQLite 项目输出 安卓音乐播放器应用输出 如何运行安卓音乐播放器应用及其源代码
recommend-type

《导师训练营》互联网项目的天花板,小白月入2w.txt

《导师训练营》互联网项目的天花板,小白月入2w
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

优化MATLAB分段函数绘制:提升效率,绘制更快速

![优化MATLAB分段函数绘制:提升效率,绘制更快速](https://ucc.alicdn.com/pic/developer-ecology/666d2a4198c6409c9694db36397539c1.png?x-oss-process=image/resize,s_500,m_lfit) # 1. MATLAB分段函数绘制概述** 分段函数绘制是一种常用的技术,用于可视化不同区间内具有不同数学表达式的函数。在MATLAB中,分段函数可以通过使用if-else语句或switch-case语句来实现。 **绘制过程** MATLAB分段函数绘制的过程通常包括以下步骤: 1.
recommend-type

SDN如何实现简易防火墙

SDN可以通过控制器来实现简易防火墙。具体步骤如下: 1. 定义防火墙规则:在控制器上定义防火墙规则,例如禁止某些IP地址或端口访问,或者只允许来自特定IP地址或端口的流量通过。 2. 获取流量信息:SDN交换机会将流量信息发送给控制器。控制器可以根据防火墙规则对流量进行过滤。 3. 过滤流量:控制器根据防火墙规则对流量进行过滤,满足规则的流量可以通过,不满足规则的流量则被阻止。 4. 配置交换机:控制器根据防火墙规则配置交换机,只允许通过满足规则的流量,不满足规则的流量则被阻止。 需要注意的是,这种简易防火墙并不能完全保护网络安全,只能起到一定的防护作用,对于更严格的安全要求,需要
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依