概念:
贪心算法(Greedy Alogorithm)又叫登山算法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但是适用范围有限的策略。
贪心算法是对某些求解
最优解问题的最简单、最迅速的技术。某些问题的最优解可以通过一系列的最优的选择即贪心选择来达到。但局部最优并不总能获得整体最优解,但通常能获得近似最优解。
策略选择:
贪心算法的原理是通过局部最优来达到全局最优,采用的是逐步构造最优解的方法。在每个阶段,都做出一个看上去最优的,决策一旦做出,就不再更改
1.零钱找回问题
#include<iostream>
using namespace std;
int main()
{
int temp,num=0; //temp为某种币值需要多少张钱,num为总共需要多少张
int n=7;
int moneylist[7] = { 5,1,2,3,2,4,1 };
int moneyvalue[7] = { 1,2,5,10,20,50,100 };
int k; //要找的钱
cout << "请输入要找的钱数" << endl;
cin >> k;
for (int i = 6; i >= 0; i--) { //找零钱操作
temp = k / moneyvalue[i];
if (temp <= moneylist[i]) {
num += temp;
k -= temp * moneyvalue[i];
cout << moneyvalue[i] << "元的钱" << temp << "张" << endl;
}
else {
num += moneylist[i];
k -= moneylist[i] * moneyvalue[i];
cout << moneyvalue[i] << "元的钱" << moneylist[i] << "张" << endl;
}
if (k == 0) break;
}
if (k != 0) cout << "您还缺少" << k << "元去找零" << endl;
if(k==0) cout << "一共至少需要" << num << "张纸币" << endl;
return 0;
}
2.背包问题
#include <iostream>
#include <vector>
using namespace std;
#define max(N1,N2) N1>N2?N1:N2
int main()
{
/*
第一行输入背包容量V和物体的个数n
接下来有n行,每行包含两个数字,分别为该物体的花费和价值
*/
vector<int> w, v;//w为花费,v为价值
vector<vector<int>> f;//f状态矩阵
int V, n;//V背包容量,n物体数
while (cin >> V >> n)
{
w.clear();
v.clear();
f.clear();
w.push_back(0);
v.push_back(0);
//输入原始数据
for (int i = 1; i <= n; i++)
{
int cur_w, cur_v;
cin >> cur_w >> cur_v;
w.push_back(cur_w);
v.push_back(cur_v);
}
//初始化状态矩阵
for (int i = 0; i <= n; i++)
{
vector<int> buff(V + 1, 0);
f.push_back(buff);
}
//动态规划过程
for (int i = 1; i <= n; i++)
{
for (int j = V; j >= 0; j--)
{
if (j >= w[i])
{
f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);
}
else
{
f[i][j] = f[i - 1][j];
}
}
}
//输出答案
int ans = f[n][V];
cout << ans << endl;
}
return 0;
}