贪心法——背包问题
今天总结了一下算法问题中的贪心法,用了一个背包问题的例子,希望可以巩固一下自己学到的知识。
一、概述
贪心法把一个复杂问题分解为一系列较为简单的局部最优选择,每一步选择都是对当前的一个扩展,直到获得问题的完整解。
二、适用范围
典型应用是求解最优化问题,而且对许多问题都能得到整体最优解。
注意:由于贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优,这种局部最优选择并不总获得整体最优解,但通常能获得近似最优解。
三、背包问题
【问题】
给定n个物品和一个容量为C的背包,物品i的重量是wi,其价值为vi,背包问题是如何选择装入背包中物品的总价值最大。
【分析】
在贪心算法中,背包问题可以有三种思路,
第一种就是直接按照物品的价值,从价值最大的开始往背包里面装,直到达到背包容量。
第二种就是直接按照物品的重量,从重量最小的开始往背包里面装,直到达到背包容量。
显然上面的两种办法都没有能力满足背包问题的最优解,因为它只是单方面的考虑的价值的增长或容量的消耗,其实最好的想法是按照单位重量的价值,往背包里面装物品。这个是比较合理的一个做法。
【算法】
设背包容量为C,且共有n个物品,物品重量存放在数组w[n]中,价值存放在数组v[n]中,问题的解存放在数组x[n]中。
第一步要做的事情是按照单位重量价值v[i]/w[i]降序排列。这里使用了一个冒泡排序:
#include<stdio.h>
int main(){
int a[10];
int i,j,t;
for(i=0;i<