您的位置:首页 > 其它

初级硬币问题

2014-08-28 19:36 197 查看
已知,有一批不同面值的硬币,没有硬币个数限制,求得到S的所有组合,以及最小,最大硬币个数。

最小、最大硬币个数可以用贪心法,但是不一定能够得到有效解,但是可以提高结题速度,此处略。

下面的解法比求解最大、最小硬币比较耗时。

static int* set;

static int  Min = 1<<10;
static  int Max = 0;

void LeastCoin(int* Value, int Len, int Goal, int cur)
{
if(Goal == 0)
{
for(int i = 0; i < cur; i++)
{
printf("%d ", set[i]);
}
if(cur > Max)
{
Max = cur;
}
if(Min > cur)
{
Min = cur;
}
printf("\n");
}
else
{
for(int i = 0; i < Len; i++)
{

if(Goal >= Value[i])
{
int ok = 1;
for(int j = 0; j < cur; j++)
{
if(set[j] > Value[i])
{
ok = 0;
break;
}
}
if(ok)
{
set[cur] = Value[i];
LeastCoin(Value, Len, Goal - Value[i], cur + 1);
}
}

}

}

}

void WLeastCoin(int* Value, int Len, int Goal)
{

printf("goal: %d\n", Goal);
set = new int [Len];
memset(set, 0 , sizeof(int)*Len);
int cur = 0;
LeastCoin(Value, Len, Goal,  cur);
printf("Max:%d \n", Max);
printf("Min:%d \n", Min);

}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: