栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

贪心法求解硬币问题和乘船问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

贪心法求解硬币问题和乘船问题

贪心算法基本要素:

  • 贪心选择性质:问题的最优解可以通过贪心选择实现(也就是先实现局部最优解,然后整体最优解可以通过一系列局部最优的选择来达到)
  • 最优子结构性质:问题的最优解包含子问题的最优解

贪心算法步骤:

  • 通过数学模型来描述问题
  • 把求解问题分成多个子问题
  • 对每一个子问题进行求解,找到局部最优解
  • 把子问题的局部最优解合成原来解问题的一个解

贪心算法和动态规划区别

 
贪心法贪心算法是自顶向下的,只查看了当前状态贪心算法,仅在当前状态下做出最好选择,即局部最优选择,然后再去解做出这个选择后产生的相应的子问题。

最优子结构性质

贪心选择性质

动态规划动态规划自底向上地求解了最优解包含的所有子问题 动态规划算法中,每步所做的选择往往依赖于相关子问题的解,因而只有在解出相关子问题时才能做出选择

最优子结构性质

重叠子问题性质

贪心法求解硬币问题:就是想办法多用面额比较大的硬币

问题描述:有1分,2分,5分,10分,50分,100分的硬币各若干枚,现在要用这些硬币来支付                        W元,最少需要多少枚硬币?

代码:

#include
using namespace std;
int V[6] = { 1,2,5,10,50,100};
int main() 
{
    int C[10];     //代表硬币个数
    int W;
    for (int i = 0;i < 6;i++) {
        cin >> C[i];       //若干硬币的数量
    }
    cin >> W;       //总金额
    int count = 0;
    for (int i = 5;i >= 0;i--)
    {
        int t = min(W/ V[i], C[i]);    
        W -= t * V[i];
        count += t;
    }
    cout << "最少需要硬币数量"< 

 

贪心法求解乘船问题 :从给出的条件分析问题的话,则是先对这些人的体重进行排序,从低到高,然后最重的和最轻的加在一起的体重是否大于船的承载重量,进而判断做出选择。

问题描述: 有n个人,第i个人的体重为wi(0<=i

关于这道题,我用到了一个排序函数sort(),

sort()是C++给的一种排序函数,头文件为 #include  

语法描述:sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。

cmp的话,可以是function,然后在main函数外面定义它的功能,这样就可以实现按照这个函数function进行排序了。

#include
#include 
using namespace std;
int main()
{
	int i, j ,C,count=0;      //i代表轻的人,j代表重
	int n, w[100];
	cin >> n>>C;
	for (int k = 0;k < n;k++)
	{
		cin >> w[k];
	}
	sort(w,w+n);
	for (i = 0, j = n - 1;j>=i;)
	{
		if (w[i] + w[j] == C || w[i] + w[j] < C)
		{
			count++;
			i++;
			j--;
		}
		else
		{
			count++;
			j--;
		}
	}
	cout << "最少的船只数量为:" << count << endl;;
	return 0;
}

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886986.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号