2014.8.19穷举法
穷举,迭代(for循环嵌套)
eg:
1 //100购物券,香皂2元,牙刷5元,洗发水15元,购物券不找零,每样至少买一个,哪个组合能吧100元正好花完 2 int count = 0; 3 for (int i = 1; i <= 40; i++)//香皂穷举 4 { 5 for (int j = 1; j <= 17; j++)//牙刷穷举 6 { 7 for (int k = 1; k <= 7; k++)//洗发水穷举 8 { 9 if (2 * i + 5 * j + 15 * k == 100)//判断总和是否正好等于100 10 { 11 Console.WriteLine("香皂{0}块,牙刷{1}只,洗发水{2}瓶", i, j, k); 12 count = count + 1;//所有种类的总数 13 } 14 } 15 } 16 } 17 Console.WriteLine(count);
输出结果为
eg:
1 //100文钱买100只鸡,公鸡2文钱,母鸡1文钱,小鸡仔半文钱,每样至少一只,问100文钱有哪些方法 2 int count = 0; 3 for (int i = 1; i <= 50; i++)//公鸡穷举 4 { 5 for (int j = 1; j <= 98; j++)//母鸡穷举 6 { 7 for (int k = 1; k <= 194; k++)//小鸡穷举 8 { 9 if (2 * i + j + 0.5 * k == 100 && i + j + k == 100)//判断 10 { 11 Console.WriteLine("公鸡{0}只,母鸡{1}只,小鸡{2}只", i, j, k); 12 count = count + 1;//种类数量 13 } 14 } 15 } 16 } 17 Console.WriteLine(count);
1 //要从代号为A、B、C、D、E、F的六个侦察员中挑选出若干人去破案,人选的配备要求,必须注意下列各点: 2 //①A、B两人至少去一个人 3 //②A、D不能一起去 4 //③A、E、F三人中要派两人去 5 //④B、C两人中至少去一人 6 //⑤C、D两人中去一人 7 //⑥若D不去,则E也不去; 8 for (int a = 0; a <= 1; a++)//每个人都作为一个循环,遍历去或不去 9 for (int b = 0; b <= 1; b++) 10 for (int c = 0; c <= 1; c++) 11 for (int d = 0; d <= 1; d++) 12 for (int e = 0; e <= 1; e++) 13 for (int f = 0; f <= 1; f++) 14 {
//判断前5个条件 15 if ((a + b > 0) && (a + d != 2) && (a + e + f == 2) && (b + c > 0) && (c + d == 1)) 16 {
//判断第6个条件 17 if (d == 0 && e == 0) 18 { 19 Console.WriteLine("{0}{1}{2}{3}{4}{5}", a, b, c, d, e, f); 20 } 21 if (d == 1) 22 { 23 Console.WriteLine("{0}{1}{2}{3}{4}{5}", a, b, c, d, e, f); 24 } 25 } 26 }
1 //求100以内所有质数的和 2 for (int i = 2; i <= 100; i++) 3 { 4 bool b = true;//定义一个布尔变量,用来判断是否为质数 5 for (int j = 2; j < i; j++) 6 { 7 //如果除1和本身有能被整除的数,则 b = false; 8 if (i % j == 0) 9 { 10 b = false; 11 } 12 } 13 //如果没有能被整除的数,就为质数,输出 14 if (b == true) 15 { 16 Console.Write(i + " "); 17 } 18 }
1 //求一个数的阶乘 5!=5*4*3*2*1 2 Console.Write("请输入一个整数(6以内):"); 3 int num = Convert.ToInt32(Console.ReadLine()); 4 int sum = 1; 5 //从数字本身开始一直遍历到1 6 for (int i = num; i > 1; i--) 7 { 8 sum = sum * i;//所有的数的积赋给sum 9 } 10 Console.WriteLine("{0}的阶乘为:{1}", num, sum);
1 //5!+4!+3!+2!+1!=? 2 int result = 0;//作为总和 3 //遍历5个数 4 for (int i = 5; i >= 1; i--) 5 { 6 int sum = 1;//sum存放每个数的阶乘的值 7 //遍历每个数阶乘的乘数 8 for (int j = i; j >= 1; j--) 9 { 10 sum = sum * j; 11 } 12 result = result + sum;//最后把每个数结成的值sum加起来 13 } 14 Console.WriteLine(result);
1 //第二种方法:使用单循环 2 int result = 0; 3 int jc = 1; 4 for (int i = 1; i <= 5; i++) 5 { 6 jc = jc * i; 7 result = result + jc;//相当于从1到5每个数的阶乘相加 8 } 9 Console.WriteLine(result);