用C计算可能的组合

时间:2015-09-11 15:52:42

标签: c

我开始学习C,而我正在尝试开发一个小应用程序。拜托,您能否提供一些关于该怎么做的提示?

我想从三个不同的品牌购买鞋子(品牌A = 50;品牌B = 100;品牌C = 150)。我需要花2000美元购买20匹鞋。

我如何编写程序来显示所有可能的组合?

E.g。 brandA(10鞋),brandB(0鞋),brandC(10鞋); brandA(1鞋),brandB(3鞋),brandC(11鞋)等

请,我现在不想要完整的代码,但有关如何操作的提示。

我非常感谢任何帮助。 TKS!

我已更新我的帖子以包含代码。这段代码有意义吗?

int main(void) {

int brandA=50, brandB=100, brandC=150, ba, bb, bc;

for(ba=0;ba<=20;ba++) {
    for(bb=0;bb<=20;bb++) {
        for(bc=0;bc<=20;bc++) {
            if(ba+bb+bc==20 && (ba*brandA)+(bb*brandB)+(bc*brandC)==2000 {
                printf("You can buy %d brandA, %d brandB, %d brandC", ba,bb,bc);   
            }
        }
    }
}

return 0;
}

3 个答案:

答案 0 :(得分:0)

首先,你必须有一个算法......

  1. 全零鞋品牌A = 0;品牌B = 0; brandC = 0
  2. 检查总数量= 0 + 0 + 0 = 0
  3. 如果不是20件 - 通过它
  4. 如果等于20件(例如:品牌A = 5;品牌B = 5;品牌C = 10) - 检查总价。
  5. 如果总价格等于2000 - 显示它,如果不是 - 传递它。
  6. 将品牌价值增加至20
  7. 重复步骤2-6
  8. 将brandB值增加到20
  9. 重复步骤2-8
  10. 将brandC值增加到20
  11. 重复步骤2-10
  12. 注意:您可以使用3个'for'周期:)

答案 1 :(得分:0)

如果你是初学者,我建议先回溯和递归。

即使回溯是一种昂贵的技术,对于初学者来说,看看递归如何为问题提供一个简单而强大的解决方案是非常好的。

以下是一些资源供您开始使用:http://web.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch19.html

如果您对编程很认真,那么您还应该阅读一些关于算法和数据结构的书籍,因为您将严重依赖这些基本原理:
1. The Algorithm Design Manual
2.务实的程序员:从熟练工到大师

答案 2 :(得分:0)

现在你已经开始工作了,我觉得在建议潜在的改进方面没有任何负罪感。正如其他人所提到的,您可以使用AB&amp;之间的关系,而不是纯粹的强力三重循环。 C消除第三个循环。请记住,在C中,通常有很多方法可以解决任何给定的问题以及处理输出的许多方法。只要逻辑和语法正确,那么唯一的区别就在于算法的效率。这是一个消除第三个循环的例子:

 #include <stdio.h>

int main (void) {

    int ca = 50;
    int cb = 100;
    int cc = 150;
    int budget = 2000;
    int pairs = 20;
    int a, b, c, cost;

    for (a = 0; a < budget/ca; a++)
        for (b = 0; b < budget/cb; b++)
        {
            c = pairs - (a + b);
            if ((cost = a * ca + b * cb + c * cc) != budget)
                continue;

            printf ("\n a (%2d) * %3d = %4d"
                    "\n b (%2d) * %3d = %4d"
                    "\n c (%2d) * %3d = %4d\n",
                    a, ca, a * ca, b, cb, b * cb, c, cc, c * cc);
            printf (" ===================\n   (%d)         %d\n", pairs, budget);
        }

    return 0;
}

<强>编译

由于您不熟悉C,因此在编译代码时,请确保始终编译警告已启用。编译器警告是有原因的,并且在极少数情况下您可以依赖不编译而没有警告的代码。至少,您需要在启用-Wall -Wextra(gcc)的情况下进行编译。如果您想针对几乎所有可能的警告检查代码,也可以包含-pedantic。例如,要编译上面的代码:

$ gcc -Wall -Wextra -pedantic -o bin/shoes shoes.c

如果要在最大程度上添加优化,可以添加:

 -Ofast  (-03 with gcc < 4.6)

<强>输出

$ ./bin/shoes

 a ( 1) *  50 =   50
 b (18) * 100 = 1800
 c ( 1) * 150 =  150
 ===================
   (20)         2000

 a ( 2) *  50 =  100
 b (16) * 100 = 1600
 c ( 2) * 150 =  300
 ===================
   (20)         2000

 a ( 3) *  50 =  150
 b (14) * 100 = 1400
 c ( 3) * 150 =  450
 ===================
   (20)         2000

 <..snip..>

 a ( 9) *  50 =  450
 b ( 2) * 100 =  200
 c ( 9) * 150 = 1350
 ===================
   (20)         2000

 a (10) *  50 =  500
 b ( 0) * 100 =    0
 c (10) * 150 = 1500
 ===================
   (20)         2000

祝你好运学习C.没有其他类似的语言可以为你提供你在C中所拥有的精确低级控制。(除了汇编程序)但是这种精确控制并不是免费的。有一个学习曲线涉及到C还有一点需要覆盖,然后你就会失去那些&#34;捞出水&#34;感觉和感觉舒适的语言。通过它提供的低级访问来学习C的好处是它将极大地提高您对编程如何工作的理解。这些知识适用于所有其他编程语言(无论其他语言如何努力隐藏您的详细信息)。 C花了很多时间。