博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法第5章上机实践报告
阅读量:4546 次
发布时间:2019-06-08

本文共 1198 字,大约阅读时间需要 3 分钟。

---恢复内容开始---

一.0-1背包问题

二.给定n(n<=100)种物品和一个背包。物品i的重量是wi,价值为vi,背包的容量为C(C<=1000)。问:应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有两个选择:装入或不装入。不能将物品i装入多次,也不能只装入部分物品i。

三.代码实现

#include
#include
using namespace std;struct baag{ double w; double p;}bag[200];int n, c, cw = 0, cp = 0, bestp = 0;int Bound(int t) { int cleft = c - cw; int b = cp; while (t <= n && bag[t].w <= cleft) { cleft -= bag[t].w; b += bag[t].p; t++; } if (t <= n) b += bag[t].p * cleft / bag[t].w; return b;} void Backtrack(int t) { if (t > n) { if (cp > bestp) bestp = cp; return; } else{ if (cw + bag[t].w <= c) { cw += bag[t].w; cp += bag[t].p; Backtrack(t + 1); cw -= bag[t].w; cp -= bag[t].p; } if (Bound(t + 1) > bestp) { Backtrack(t + 1); } } }bool cmp(baag a, baag b) { double ap = a.p / a.w; double bp = b.p / b.w; return ap > bp;}int main() { cin >> n >> c; for (int i = 1; i <= n; i++) { cin >> bag[i].w >> bag[i].p; } sort(bag + 1, bag + n + 1, cmp); Backtrack(1); cout << bestp;}

  四.通过回溯法实现0-1背包问题,在分支中进行选择,慢满足条件则继续执行,不满足则回溯到上一步选择右子树,直到满足要求输出。结对时,发现问题较难,因此采取互相讨论,再结合课本的样例,最终实现的代码。这个过程中,讨论和交流起到重要作用。

转载于:https://www.cnblogs.com/czmichael/p/10164259.html

你可能感兴趣的文章
《学习之道》第三章学习方法12批评使我们更优秀
查看>>
猫眼首页
查看>>
java面试题之数据基本类型各占几个字节
查看>>
设计模式(总纲)
查看>>
线程池技术
查看>>
http后台json解析实例
查看>>
iOS中延时执行方法的比较和汇总
查看>>
1284 2 3 5 7的倍数
查看>>
php 手记
查看>>
设计模式-注册树模式
查看>>
Unity基本API总览
查看>>
如何将一段文本编译成C#内存程序的过程
查看>>
PAT——1070. 结绳
查看>>
【23.33%】【codeforces 664C】International Olympiad
查看>>
java-网络编程-使用URLDecoder和URLEncoder
查看>>
最短路之dijkstra算法
查看>>
SHDP--Working With HBase (二)之HBase JDBC驱动Phoenix与SpringJDBCTemplate的集成
查看>>
Lua语法基础(一)
查看>>
.Net Core2.*学习手册
查看>>
实验一、命令解释程序的编写实验
查看>>