贪心算法:
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
问题描述:
给定一组有固定重量的物品,每一种物品都只有一件,可以选择放或者不放。现在假设有n件物品,背包承重为m。问背包背包最多能放下几件物品?
思绪
- 输入物品的总数,背包大小和每个物品对应的重量
- 将物品按照重量从小到大排列起来
- 按照重量从小到大取物品直至达到背包的最大承重
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void bubble(int data[], int n){ //冒泡排序(代码最简易的排序)
int i, j, tmp;
for (i = 0; i < n - 1; i++){
for (j = 0; j < n - 1 - i; j++){
if (data[j] > data[j + 1]){
tmp = data[j];
data[j] = data[j + 1];
data[j + 1] = tmp;
}
}
}
}
int main(){
int num, size;
int weight[20] = { 0 };
int i, sum = 0;
printf("请输入物品的数量和背包大小:");
scanf("%d%d", &num, &size);
printf("请输入每个物品的重量:");
for (i = 0; i < num; i++){
scanf("%d", weight + i);
}
bubble(weight, num); //将物品的重量由小到大排序
for (i = 0; sum + weight[i] <= size && i < num; i++){
sum += weight[i];
}
printf("背包能放下的最大数量为 %d个\n", i);
system("pause");
return 0;
}
代码生成图:
问题描述:
现在有n个人要过河,河边有很多船,每个船最多载2人,穿的承重为100kg。过河的船数是多少?
思绪
- 输入河边人的数量,船的承重和每个人的重量
- 将每个人按照重量从小到大排列起来
- 按每次取重量最小的和重量最大的人判断是否超过船的最大承重
- 如果超过,重量最大的人一人乘船离开,重复执行3,用count计数;如果没超过,两人一起乘船离开,重复执行3,用count计数。
- 直到河边人数走光,count的值为过河的船数
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void bubble(int data[], int n){ //冒泡排序(代码最简易的排序)
int i, j, tmp;
for (i = 0; i < n - 1; i++){
for (j = 0; j < n - 1 - i; j++){
if (data[j] > data[j + 1]){
tmp = data[j];
data[j] = data[j + 1];
data[j + 1] = tmp;
}
}
}
}
int main(){
int num, size;
int weight[20] = { 0 };
int i, j;
int sum = 0, count = 0;
printf("请输入岸边人的数量和船的大小:");
scanf("%d%d", &num, &size);
printf("请输入每个人的体重:");
for (i = 0; i < num; i++){
scanf("%d", weight + i);
}
bubble(weight, num); //将人的体重由小到大排序
for (i = 0, j = num - 1; i < j; j--){
if (weight[i] + weight[j] <= size){
i++;
}
count++;
}
printf("过河的船数右 %d条\n", count);
system("pause");
return 0;
}
代码生成图: