既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
贪心算法的核心思想是每次都选择局部最优解,而不考虑全局的情况。通过不断地做出局部最优选择,整体上就能得到一个接近最优解的解。
然而,贪心算法并不是在所有情况下都能得到最优解。由于贪心算法只考虑当前的最优选择,而不进行回溯,可能会导致最终结果并非全局最优解。因此,在使用贪心算法时,需要确保问题具备贪心选择性质(即局部最优解能够导致全局最优解)以及最优子结构性质(即问题的最优解包含了其子问题的最优解)。
在应用贪心算法时,可以采用贪心选择、最优子结构和证明最优性三个步骤来设计算法。首先,通过贪心选择找到局部最优解;然后,通过证明最优性来证明贪心选择是安全的;最后,通过最优子结构来将问题分解为子问题,并迭代地求解子问题。
总之,贪心算法是一种简单而有效的算法,可以在一些满足贪心选择性质和最优子结构性质的问题上得到最优解。然而,在应用贪心算法时需要注意验证问题的性质,以确保得到正确的结果。
题目一(找零问题):
代码:
#include<iostream>
using namespace std;
int main()
{
int n, i = 1;
cin >> n;
int a[6] = { 0,100,50,20,5,1 };
int cnt[6] = { 0 };
while (n)
{
cnt[i] = n / a[i];
n -= cnt[i] * a[i];
i++;
}
for (int i = 1; i <= 5; i++)
cout << a[i] << ":" << cnt[i] << endl;
}
题目二(分糖果):
代码:
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[105];
int ans = 0;
for (int i = 1; i <= n; i++)
cin >> a[i];
while (1)
{
int temp = a[1] / 2;//记录第一个孩子的一半,要给最后一个孩子的
for (int i = 1; i < n; i++)
{
a[i] = a[i] / 2 + a[i + 1] / 2;//依次传递
}
a[n] = a[n] / 2 + temp;//最后一个的为自身一半加上第一个孩子的一半
int flag = 1;//记录是否都相同
for (int i = 1; i <= n; i++)
{
if (a[i] != a[1])
{
flag = 0;//标记为不同
}
if (a[i] % 2 == 1)//为基数补一个
{
a[i] += 1;
ans++;//记录加上补了一个
}
}
if (flag == 1)//都相同跳出
break;
}
cout << ans;
}
题目三(翻硬币):
代码:
#include<iostream>
using namespace std;
string s, x;
int cnt=0;
void swaps(int k)
{
if (s[k] == '*')
s[k] = 'o';
else
s[k] = '*';
![img](https://img-blog.csdnimg.cn/img_convert/c270a326610fc759ba7b8c365d0e8f68.png)
![img](https://img-blog.csdnimg.cn/img_convert/5a63e76bbb10977835f5a178c5b8f8df.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
*由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**