贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
钱币找零
假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。在程序中已经事先将Value按照从小到大的顺序排好。
#include<stdio.h>
int min(int i,int j)
{
return i > j ? j : i;
}
void *pay(int k,int *values,int *counts,int *res,int len)
{
//scheme is from max value to min value
for (int i = len - 1; i >= 0; i--)
{
int num = 0;
int c = min(k/(*(values + i)),*(counts + i));
num += c;
k -= *(values + i);
*(res + i) = num;
}
}
void print(int *values,int *res,int len)
{
for(int i = 0; i <= len - 1; i++)
if(*(res + i) != 0)
printf("value %d yuan need %d count\n",
*(values + i),*(res + i));
}
int main(void)
{
//Renminbi
int values[] = { 1, 2, 5, 10, 20, 50, 100 };
//count corresponding yuan
int counts[] = { 3, 1, 2, 1, 1, 3, 5 };
//result arr for need count for K yuan
int res[] = { 0, 0, 0, 0, 0, 0, 0 };
int len = sizeof(values)/sizeof(int);
// k = 442 yuan
pay(442, values, counts,res,len);
print(values,res,len);
return 0;
}