穷举法组合数值,求更精

在英国,货币是由英镑£,便士p构成的。一共有八种钱币在流通:
1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) 和 £2 (200p).
要构造£2可以用如下方法:
1 × £1 + 1 × 50p + 2 × 20p + 1 × 5p + 1 × 2p + 3 × 1p
允许使用任意数目的钱币,一共有多少种构造£2的方法?

第一次穷举法(我很菜):

代码跟第二次的差不多,就是第一次没有这些if 跟break:

if(i_p1*p1+i_p2*p2>f2)break;  if(i_p1*p1+i_p2*p2+i_p5*p5>f2)break;

省略后面雷同。。。

计算结果所花时间为180s。

下面是第二次的:(计算结果所花时间18s)

#include <stdio.h>
#define p1 1
#define p2 2
#define p5 5
#define p10 10
#define p20 20
#define p50 50
#define f1 100
#define f2 200
int main()
{
    int count=0,i_p1,i_p2,i_p5,i_p10,i_p20,i_p50,i_f1,i_f2;
    for(i_p1=0; i_p1<=f2; i_p1++)
    {
        for(i_p2=0; i_p2<=f1; i_p2++)
        {
            if(i_p1*p1+i_p2*p2>f2)break;
            for(i_p5=0; i_p5<=40; i_p5++)
            {
                if(i_p1*p1+i_p2*p2+i_p5*p5>f2)break;
                for(i_p10=0; i_p10<=p20; i_p10++)
                {
                    if(i_p1*p1+i_p2*p2+i_p5*p5+i_p10*p10>f2)break;
                    for(i_p20=0; i_p20<=p10; i_p20++)
                    {
                        if(i_p1*p1+i_p2*p2+i_p5*p5+i_p10*p10+i_p20*p20>f2)break;
                        for(i_p50=0; i_p50<=4; i_p50++)
                        {
                            if(i_p1*p1+i_p2*p2+i_p5*p5+i_p10*p10+i_p20*p20+i_p50*p50>f2)break;
                            for(i_f1=0; i_f1<=2; i_f1++)
                            {
                                if(i_p1*p1+i_p2*p2+i_p5*p5+i_p10*p10+i_p20*p20+i_p50*p50+i_f1*f1>f2)break;
                                for(i_f2=0; i_f2<=1; i_f2++)
                                {
                                    if(i_p1*p1+i_p2*p2+i_p5*p5+i_p10*p10+i_p20*p20+i_p50*p50+i_f1*f1+i_f2*f2==f2)
                                    {
                                        count++;
                                        printf("%d\t1:%d2:%d5:%d10:%d20:%d50:%df1:%df2:%d\n",count,i_p1,i_p2,i_p5,i_p10,i_p20,i_p50,i_f1,i_f2 );
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    printf("%d\n",count);
    return 0;
}
请各位大大提点一下,有没有更好的办法,我每次只能想到穷举法。。。囧

你可能感兴趣的:(穷举法组合数值,求更精)