4.25分享(贪心算法基础)

贪心选择的概念

贪心算法总是做出在当前看来是最好的选择(局部最优解),通过选择局部的最优解最终可以得到整体的最优解。也就是将一个大问题分解成小的问题后,只需考虑小问题的最优解就可以了,最终组成大问题的最优解。这就需要确定每一步所做的贪心选择能够使问题整体最优解。

解题的基本思路

贪心算法基本的解题思路:

⒈ 建立数学模型来描述问题。
⒉ 把求解的问题分成若干个子问题。
⒊ 对每一子问题求解,得到子问题的局部最优解。
⒋ 把子问题的解局部最优解合成原来解问题的一个解。

对贪心算法的理解

尽最大的可能将满足题意的物品(或其他)选中,并尽可能的多选。

贪心算法的基本流程:

Greedy (C) { //C是问题的输入集合即候选集合
    S = { };  //初始解集合为空集
    while (not solution(S)) { //集合S没有构成问题的一个解
       x = select(C);    //在候选集合C中做贪心选择
       if feasible(S,  x)  //判断集合S中加入x后的解是否可行
          S = S + {x};
          C = C - {x};
    }
   return S;
}

例题

部分背包问题

在这里插入图片描述

虽然这里和刚才说的贪心的做题基本有一些小小的区别,但是大体的思路是相同的。

问题的输入集合即候选集合:表示每个单位金子的价格c[105]和数量a[105]

初始解集合为空集:sum 和total;

在候选集合C中做贪心选择:for循环中的if;

判断集合S中加入x后的解是否可行:for循环中的条件 (条件繁琐时,可以写成函数)

#include<stdio.h>
int a[105], b[105];
float c[105];
int main(void){
    int i, n, t;
    float sum, total;
    scanf("%d %d", &n, &t);
    for (i = 0; i < n; i++) {
        scanf("%d %d", &a[i], &b[i]);
        c[i] = b[i] / (a[i] * 1.0);
    }
    sort(0, n - 1); //排序函数,没有放在这里
    sum = 0;
    total = 0;
    for (i = 0; i < n; i++) {
        if (sum + a[i] <= t) {   
            sum += a[i];
            total += a[i] * c[i];
        } else {
            total += (t - sum) * c[i];
            break;
        }
    }
	printf("%.2f", total);
    return 0;
}

纸币找零问题

题目: 假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。
现在要用这些钱来支付K元,至少要用多少张纸币?

用贪心算法的思想,很显然,每一步尽可能多的用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。

#include<stdio.h>
int min(int n, int m) {
	if (m > n) {
		return n;
	} else {
		return m;
	}
}
int main(void) {
	int k, t = 0, i, c[7], v;
	int a[6] = {2, 5, 2, 1, 1, 1}; //存储对应面额钱币的张数
	int b[6] = {1, 5, 10, 20, 50, 100};  //对应的钱币面额
	scanf("%d", &k);
	for(i = 5; i >= 0; i--) {
		v = min(k / b[i], a[i]);  //取某一面额 需要的张数和有的张数的较小值
		k -= v * b[i];
		t += v;    //t记录使用的纸币的张数
	}
	if (k > 0) {  //所有的纸币搭配无法达到对应的金额
		t = -1;
	}
	if(t == -1) {
		printf("no\n");
	} else {
		printf("%d\n", t);
	}
	return 0;
}

贪心算法与动态规划的区别

1.还是以纸币找零问题来说,如果改变纸币的面值为1, 3 ,4 ,想要得到总共为6元的钱。

按照贪心算法来计算就应该是 一张4元,两张1元。显然这不是最优解,所以说,贪心算法不一定能得到最优解,这也就是贪心算法的局限性。

但是如果用动态规划的话,就可以得到最优的解。

2.贪心算法是自顶向下的,而动态规划是自底向上的。

3.贪心算法是动态规划的一种特例,贪心算法可以解决的题目用动态规划也可以解决,但动态规划的部分题目,贪心算法解决不了。

4.同一道题目,贪心算法和动态规划都可以解决,贪心算法的时间复杂度和空间复杂度比动态规划高。

坚果保龄球

在这里插入图片描述

这道题也是属于一道贪心算法的题目,目的是用最少的坚果消灭所有僵尸。

#include<stdio.h>
int c[200005];
int main(void) {
    int n, p[200005], a[200005];
    int i, j, sum = 0, t = 0, q;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d %d", &p[i], &a[i]);
        c[i] = p[i] * 1000000 + a[i];  //将两个数据构成一个新的数据,数据对这个新的数据排序就可以实现对每行的僵尸进入时间排序。
    }
	sort(0, n - 1);  //排序
    for (i = 0; i < n; i++) {
        p[i] = c[i] / 1000000;  //重新将数据分离出来
        a[i] = c[i] % 1000000;
    }
	q = a[0];
	sum = 1;
	for (i = 1; i < n; i++) {
		if (q + 60  <= a[i] && p[i - 1] == p[i]) {
			sum++;  //同一行某一时刻达到了这行的僵尸数最大。
			q = a[i];//另下一个僵尸进入的时间为起始时间
		}
		if (p[i - 1] != p[i]) {  //遍历到第二行,无论上一行什么情况,下一行都得重新开始一个坚果。
			sum++;
			q = a[i];
		}
	}
    printf("%d\n", sum);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: UE4.25是著名的游戏引擎Unreal Engine的最新版本,而Gitee则是一个国内知名的代码托管平台。在UE4.25中,通过使用Gitee平台,可以更加方便地进行代码的管理和团队协作。一方面,Gitee平台提供了完整的代码托管和版本管理功能,使得开发者可以随时备份和恢复项目代码,并通过分支和合并等操作,轻松地协同工作。另一方面,Gitee平台还提供了项目协作、代码审核等功能,有利于多人协同开发代码和提高开发效率。不仅如此,Gitee平台还优化了代码仓库的访问速度,提供丰富的开发者社区资源,以及支持多种Webhooks和CI/CD服务,使得开发者能够拥有更加顺畅的开发体验。因此,对于使用UE4.25进行游戏开发的团队来说,Gitee平台是一个非常值得考虑和使用的代码托管和协作平台。 ### 回答2: UE4.25是开发游戏的一款强大的引擎,而Gitee是一个国内知名的代码托管平台。将UE4.25与Gitee结合使用,可以更高效地管理团队的代码。通过在Gitee上创建仓库,团队成员可以很方便地进行协作开发,同步更新代码,并保证代码的版本控制。同时,Gitee支持一个可视化的操作界面,方便开发者进行代码的管理和修改。与其他代码托管平台相比,Gitee的优势在于服务器位于国内,能够提供更好的访问速度和稳定性。此外,Gitee还通过开放API支持与第三方工具的集成,方便开发者进行项目管理和自动化构建等工作。因此,将UE4.25与Gitee结合使用,可以有效地提高团队协作和开发效率,使开发者更加专注于游戏的制作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值