文章目录
- 趣学算法
第一章:贪心
贪心的两个重要特性:贪心选择性质、最优子结构性质。
1.贪心选择性质:指原问题的整体最优解可以通过一些列的局部最优的选择得到。依赖于自己已经做出的选择,运用贪心策略解决问题的过程中无法回溯。
2.最优子结构:当一个问题的最优解包含了其子问题的最优解的时,称此问题具有最优子结构的性质。
1. 加勒比海盗船-最优装载问题
海盗船载重为C,每件古董价值都一样,重量为Wi,海盗们如何获取最多的古董?
一:算法设计
a.载重为C的时候,wi越小我们可以载的物品就越多,所以只要依次选择前面最小的,直到不能装为止。
b.把n个物品按照重量进行排序,从小到大,然后按照贪心策略尽可能多的选择前面的i个物品,直到不能装下即可。
二:实战代码
#include<iostream>
#include<algorithm> // 万能头文件
using namespace std;
const int N = 1000005;
double w[N];
int main()
{
double c, temp = 0.0;
int ans = 0 , n ,j = 0;
cout << "请输入船重c以及古董的数量n:" << endl;
cin >> c >> n;
cout << "请输入古董的重量,用空格分开:" << endl;
for(int i = 0 ; i <= n; i++)cin >> w[i];
sort( w, w + n);
while(temp <= c)
{
temp += w[j++];
if(temp > c)break;
else ans++;
}
cout << ans << endl;
return 0;
}
三:思考-如果想知道装入了哪一些物品,应该如何设计?
1.标记原位置与排序后的位置
2.创建一个新数组来记录录入的物品值
2. 阿里巴巴与四十大盗-背包问题
假设山洞中有n种宝物,每种宝物都有一定的重量w和相应的价值v,毛驴运载能力有限,只能运走m重量的宝物,一种宝物只能拿一样,宝物可以分割,那么怎么才能使毛驴运走的宝物的价值最大呢?
一:算法设计
1.数据结构初始化,将n种宝物的重量和价值存储在结构体中three(重量,价值,性价),同时求出每种宝物的性价比也存储在对应的结构体中,将性价比从高到低来排序,采用sum才存储能够运走的最大价值,初始化为0。
2.使用贪心策略,按照性价比从大到小选取宝物,直到达到毛驴的运载能力,每次都选择性价比高的物品,判断是否小于m,如果小于m,则放入,sum加上当前宝物的价值,m减去当前宝物的价值,如果不小于m,则取该宝物的一部分。
二:实战演练
#include<iostream>
#include<algorithm>
using namespace std;
const int M = 1000005;
struct three{
double w;
double v;
double p;
}s[M];
bool cmp(three a,three b)
{
return a.p > b.p;
}
int main()
{
int n , a = 0;
double m;
cin >> n >> m;
for(int i =</