问题描述
- C语言 递归,好像跳不出递归循环了,求大神帮忙看看
-
啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。int num_pi=0; int num_yin=1; int money = 823; int fun(int mon); int main() { fun(0); return 0; } int fun(int mon) { if(mon > money) return 0; if(mon == money && num_pi<num_yin){ printf("%dn",num_pi); return 0; } num_pi++; fun(mon+23); num_yin++; fun(mon+19); }
解决方案
void foo(int beer, int beverage)
{
if (beer < 0 || beverage < 0) return;
if (beer * 23 + beverage * 19 == 823)
{
if (beer < beverage)
printf("%d %dn", beer, beverage);
}
if (beer * 23 + beverage * 19 < 823)
{
foo(beer, beverage + 1);
}
else
{
foo(beer - 1, beverage);
}
}
int main()
{
foo(823 / 23, 0);
}
解决方案二:
加多一个条件,会快很多
#include <iostream>
int num_pi=0;
int num_yin=0;
int money = 823;
int fun(int mon);
int main()
{
fun(0);
return 0;
}
int fun(int mon)
{
if(mon > money||num_pi>num_yin)
return 0;
if(mon == money && num_pi<num_yin){
printf("%dn",num_pi);
return -1;
}
num_pi++;
if(fun(mon+23)==-1){
return -1;
}
num_pi--;
num_yin++;
if(fun(mon+19)==-1){
return -1;
}
num_yin--;
}
解决方案三:
11 30
http://codepad.org/D17vzJEB
解决方案四:
思路,beer从大到小,beverage从小到大,如果多了就减酒,如果少了,就加饮料。
解决方案五:
递归解题有点暴力,需要枚举所有组合,除条件设置排除外。
解决方案六:
貌似算法不怎么好,时间太久
#include <iostream>
int num_pi=0;
int num_yin=0;
int money = 823;
int fun(int mon);
int main()
{
fun(0);
return 0;
}
int fun(int mon)
{
if(mon > money)
return 0;
if(mon == money && num_pi<num_yin){
printf("%dn",num_pi);
return -1;
}
num_pi++;
if(fun(mon+23)==-1){
return -1;
}
num_pi--;
num_yin++;
if(fun(mon+19)==-1){
return -1;
}
num_yin--;
}
时间: 2025-01-02 04:20:41