贪心算法

ganyingshiwo 2011-05-20 01:31:04
目前网上的找零贪心算法实现,基本上都是在用来找零的各种面额的零钱无限的情况下进行的。如果用来找零的各种面额的零钱不是无限的情况下,应该怎么办呢?举个例子如下

可找零面额
5,2,1,0.5。 目前只有7张5元,`3张2元可用来找零。如果要找21元,按照贪心算法,上来就会先用4张5元的进行找零。这样就找不开了,因此只能找零3张五元,三张两元。这类应该需要回朔的问题算法上如何实现呢?
...全文
166 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrackValue 2011-05-20
  • 打赏
  • 举报
回复

#include <stdio.h>

typedef struct _Money
{
float fMon;
int count;
}Money, *PMoney;

Money MonData[4]={{5.0, 7}, {2.0, 3}, {1.0, 0}, {0.5, 0}};
Money temp[4] = {{5.0, 0}, {2.0, 0}, {1.0, 0}, {0.5, 0}};

int find(float fr, int ind)
{
int i = 0, j = 0;
float fsum = 0;
for(i = 0; i <= ind; i++)
{
fsum += temp[i].fMon * temp[i].count;
}
if (fsum == fr)
{
for (j=0; j<ind+1; j++)
{
if(temp[j].count)
printf("(%f * %d) ",temp[j].fMon, temp[j].count);
}
printf("\n");
return 1;
}
else if (fsum > fr) return 0;
else for (i=ind; i<4; i++)
{
if(temp[i].count >= MonData[i].count) continue;
temp[i].count++;
if(find(fr, i))
return 1;
temp[i].count--;
}
}


int main()
{
printf("begin:\n");
if(!find(21.0, 0))
printf("Can not fine result!\n");
getch();
return 0;
}


我很菜,这是根据7楼的改的,不知道能不能行
ganyingshiwo 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yrw188 的回复:]

#include <stdio.h>
#include <stdlib.h>

#define MAX_VALUE 4

float price[MAX_VALUE]={5,2,1,0.5};
int temp[MAX_VALUE]={0}; //记录每类钱的次数

void function(float sum, int index)
……
[/Quote]

这个方法是穷举法,不太好,效率比较低下吧应该
ganyingshiwo 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yrw188 的回复:]

#include <stdio.h>
#include <stdlib.h>

#define MAX_VALUE 4

float price[MAX_VALUE]={5,2,1,0.5};
int temp[MAX_VALUE]={0}; //记录每类钱的次数

void function(float sum, int index)
……
[/Quote]

谢谢这位大哥,马上研究
yrw8888888 2011-05-20
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

#define MAX_VALUE 4

float price[MAX_VALUE]={5,2,1,0.5};
int temp[MAX_VALUE]={0}; //记录每类钱的次数

void function(float sum, int index)
{
int i,j;
if(sum==21)
{
for (j = 0; j < MAX_VALUE; j++)
printf("%d ",temp[j]);
printf("\n");
return;
}
else if(sum>21)
return;
else for (i = index; i < MAX_VALUE; i++)
{
temp[i]++;
function(sum+price[i], i);
temp[i]--;
}
}

int main()
{
function(0, 0);
system("pause");
return 0;
}



LZ自己研究下!!!
maoxing63570 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ganyingshiwo 的回复:]
有道理,研究一下,回朔算法是递归实现的吗?
[/Quote]
递归和非递归都有
ganyingshiwo 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 maoxing63570 的回复:]
引用楼主 ganyingshiwo 的回复:
目前网上的找零贪心算法实现,基本上都是在用来找零的各种面额的零钱无限的情况下进行的。如果用来找零的各种面额的零钱不是无限的情况下,应该怎么办呢?举个例子如下

可找零面额
5,2,1,0.5。 目前只有7张5元,`3张2元可用来找零。如果要找21元,按照贪心算法,上来就会先用4张5元的进行找零。这样就找不开了,因此只能找零3张五元,三张两元。这……
[/Quote]

有道理,研究一下,回朔算法是递归实现的吗?
maoxing63570 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 ganyingshiwo 的回复:]
目前网上的找零贪心算法实现,基本上都是在用来找零的各种面额的零钱无限的情况下进行的。如果用来找零的各种面额的零钱不是无限的情况下,应该怎么办呢?举个例子如下

可找零面额
5,2,1,0.5。 目前只有7张5元,`3张2元可用来找零。如果要找21元,按照贪心算法,上来就会先用4张5元的进行找零。这样就找不开了,因此只能找零3张五元,三张两元。这类应该需要回朔的问题算法上如何实现呢?
[/Quote]
就是你说的回溯算法了
ganyingshiwo 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 thefirstz 的回复:]
穷举不也挺方便啊
[/Quote]

我说的只是个例子,实际情况要复杂很多,
没有办法穷举。
liutengfeigo 2011-05-20
  • 打赏
  • 举报
回复
返回false之后返回到选了3张5的那里然后换一种选法,选2,2,2 成功....
昵称很不好取 2011-05-20
  • 打赏
  • 举报
回复
穷举不也挺方便啊

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧