C:贪心算法之0-1背包问题和过河问题

贪心算法:

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

问题描述:
给定一组有固定重量的物品,每一种物品都只有一件,可以选择放或者不放。现在假设有n件物品,背包承重为m。问背包背包最多能放下几件物品?

思绪

  1. 输入物品的总数,背包大小和每个物品对应的重量
  2. 将物品按照重量从小到大排列起来
  3. 按照重量从小到大取物品直至达到背包的最大承重

代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include
#include

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;
}

代码生成图:
C:贪心算法之0-1背包问题和过河问题_第1张图片

问题描述:
现在有n个人要过河,河边有很多船,每个船最多载2人,穿的承重为100kg。过河的船数是多少?

思绪

  1. 输入河边人的数量,船的承重和每个人的重量
  2. 将每个人按照重量从小到大排列起来
  3. 按每次取重量最小的和重量最大的人判断是否超过船的最大承重
  4. 如果超过,重量最大的人一人乘船离开,重复执行3,用count计数;如果没超过,两人一起乘船离开,重复执行3,用count计数。
  5. 直到河边人数走光,count的值为过河的船数

代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include
#include

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;
}

代码生成图:
C:贪心算法之0-1背包问题和过河问题_第2张图片

你可能感兴趣的:(C语言,算法)