求解:用C#编程,1,2,5,N个相加等于100

大明明德 2010-04-01 10:19:43
有三个数1,2,5
要求这三个数用不同的方法相加得到100,比如100个1相加等于100,或者50个1与25个2相加等于100
...全文
519 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
cong909628 2010-04-01
  • 打赏
  • 举报
回复
if(路过||帮顶||学习)
{
return 得分;
}else
{
return 不仗义;
}
huaixiaohai1989 2010-04-01
  • 打赏
  • 举报
回复
楼上的方法都不错啊!!
keeya0416 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 lcl_data 的回复:]
21的代码是全排列

所以结果很多
[/Quote]
你那用递归的话可能有好的重复项吧?
我刚开始用递推也是
十八道胡同 2010-04-01
  • 打赏
  • 举报
回复
21的代码是全排列

所以结果很多
keeya0416 2010-04-01
  • 打赏
  • 举报
回复

class Class1
{
public static void Main(string[] args)
{
PrintHowToDivide(100);
System.Console.ReadKey();
}


public static void PrintHowToDivide(int value)
{
int temp = value;
int five = value / 5;
value %= 5;
int two = value / 2;
value %= 2;
int one = value;
PrintHowToDivide(temp, five, two, one);
}


/*
* value为需要分解的钱,num_five, num_two, num_one 分别为当前的 5 2 1块的张数
*
* */
private static void PrintHowToDivide(int value, int num_five, int num_two, int num_one)
{
System.Console.WriteLine(" {0} 块钱有如下分法: {1} 张 5 元,{2} 张 2 元,{3} 张 1 元", value, num_five, num_two, num_one);
if (num_one == value) return;
if (num_two > 0)
{
PrintHowToDivide(value, num_five, num_two - 1, num_one + 2);
}
else if (num_five > 0)
{
PrintHowToDivide(value, num_five - 1, num_two + (num_one + 5) / 2, (num_one + 5) % 2);
}
}
}

keeya0416 2010-04-01
  • 打赏
  • 举报
回复
还是有点问题
最后修改一次
对不住楼主了哈。
keeya0416 2010-04-01
  • 打赏
  • 举报
回复
改好了

class Class1
{
public static void Main(string[] args)
{
PrintHowToDivide(100);
System.Console.ReadKey();
}


public static void PrintHowToDivide(int value)
{
int temp = value;
int five = value / 5;
value %= 5;
int two = value / 2;
value %= 2;
int one = value;
PrintHowToDivide(temp, five, two, one);
}


/*
* value为需要分解的钱,num_five, num_two, num_one 分别为当前的 5 2 1块的张数
*
* */
private static void PrintHowToDivide(int value, int num_five, int num_two, int num_one)
{
System.Console.WriteLine(" {0} 块钱有如下分法: {1} 张 5 元,{2} 张 2 元,{3} 张 1 元", value, num_five, num_two, num_one);
if (num_one == value) return;
if (num_two > 0)
{
PrintHowToDivide(value, num_five, num_two - 1, num_one + 2);
}
else if (num_five > 0)
{
if (num_one > 0)
{

PrintHowToDivide(value, num_five-1, num_two + 3, num_one - 1);

}
else
{
PrintHowToDivide(value, num_five-1, num_two + 2, num_one + 1);
}
}
}
}

测试结果
100 块钱有如下分法: 20 张 5 元,0 张 2 元,0 张 1 元
100 块钱有如下分法: 19 张 5 元,2 张 2 元,1 张 1 元
100 块钱有如下分法: 19 张 5 元,1 张 2 元,3 张 1 元
100 块钱有如下分法: 19 张 5 元,0 张 2 元,5 张 1 元
100 块钱有如下分法: 18 张 5 元,3 张 2 元,4 张 1 元
100 块钱有如下分法: 18 张 5 元,2 张 2 元,6 张 1 元
100 块钱有如下分法: 18 张 5 元,1 张 2 元,8 张 1 元
100 块钱有如下分法: 18 张 5 元,0 张 2 元,10 张 1 元
100 块钱有如下分法: 17 张 5 元,3 张 2 元,9 张 1 元
100 块钱有如下分法: 17 张 5 元,2 张 2 元,11 张 1 元
100 块钱有如下分法: 17 张 5 元,1 张 2 元,13 张 1 元
100 块钱有如下分法: 17 张 5 元,0 张 2 元,15 张 1 元
100 块钱有如下分法: 16 张 5 元,3 张 2 元,14 张 1 元
100 块钱有如下分法: 16 张 5 元,2 张 2 元,16 张 1 元
100 块钱有如下分法: 16 张 5 元,1 张 2 元,18 张 1 元
100 块钱有如下分法: 16 张 5 元,0 张 2 元,20 张 1 元
100 块钱有如下分法: 15 张 5 元,3 张 2 元,19 张 1 元
100 块钱有如下分法: 15 张 5 元,2 张 2 元,21 张 1 元
100 块钱有如下分法: 15 张 5 元,1 张 2 元,23 张 1 元
100 块钱有如下分法: 15 张 5 元,0 张 2 元,25 张 1 元
100 块钱有如下分法: 14 张 5 元,3 张 2 元,24 张 1 元
100 块钱有如下分法: 14 张 5 元,2 张 2 元,26 张 1 元
100 块钱有如下分法: 14 张 5 元,1 张 2 元,28 张 1 元
100 块钱有如下分法: 14 张 5 元,0 张 2 元,30 张 1 元
100 块钱有如下分法: 13 张 5 元,3 张 2 元,29 张 1 元
100 块钱有如下分法: 13 张 5 元,2 张 2 元,31 张 1 元
100 块钱有如下分法: 13 张 5 元,1 张 2 元,33 张 1 元
100 块钱有如下分法: 13 张 5 元,0 张 2 元,35 张 1 元
100 块钱有如下分法: 12 张 5 元,3 张 2 元,34 张 1 元
100 块钱有如下分法: 12 张 5 元,2 张 2 元,36 张 1 元
100 块钱有如下分法: 12 张 5 元,1 张 2 元,38 张 1 元
100 块钱有如下分法: 12 张 5 元,0 张 2 元,40 张 1 元
100 块钱有如下分法: 11 张 5 元,3 张 2 元,39 张 1 元
100 块钱有如下分法: 11 张 5 元,2 张 2 元,41 张 1 元
100 块钱有如下分法: 11 张 5 元,1 张 2 元,43 张 1 元
100 块钱有如下分法: 11 张 5 元,0 张 2 元,45 张 1 元
100 块钱有如下分法: 10 张 5 元,3 张 2 元,44 张 1 元
100 块钱有如下分法: 10 张 5 元,2 张 2 元,46 张 1 元
100 块钱有如下分法: 10 张 5 元,1 张 2 元,48 张 1 元
100 块钱有如下分法: 10 张 5 元,0 张 2 元,50 张 1 元
100 块钱有如下分法: 9 张 5 元,3 张 2 元,49 张 1 元
100 块钱有如下分法: 9 张 5 元,2 张 2 元,51 张 1 元
100 块钱有如下分法: 9 张 5 元,1 张 2 元,53 张 1 元
100 块钱有如下分法: 9 张 5 元,0 张 2 元,55 张 1 元
100 块钱有如下分法: 8 张 5 元,3 张 2 元,54 张 1 元
100 块钱有如下分法: 8 张 5 元,2 张 2 元,56 张 1 元
100 块钱有如下分法: 8 张 5 元,1 张 2 元,58 张 1 元
100 块钱有如下分法: 8 张 5 元,0 张 2 元,60 张 1 元
100 块钱有如下分法: 7 张 5 元,3 张 2 元,59 张 1 元
100 块钱有如下分法: 7 张 5 元,2 张 2 元,61 张 1 元
100 块钱有如下分法: 7 张 5 元,1 张 2 元,63 张 1 元
100 块钱有如下分法: 7 张 5 元,0 张 2 元,65 张 1 元
100 块钱有如下分法: 6 张 5 元,3 张 2 元,64 张 1 元
100 块钱有如下分法: 6 张 5 元,2 张 2 元,66 张 1 元
100 块钱有如下分法: 6 张 5 元,1 张 2 元,68 张 1 元
100 块钱有如下分法: 6 张 5 元,0 张 2 元,70 张 1 元
100 块钱有如下分法: 5 张 5 元,3 张 2 元,69 张 1 元
100 块钱有如下分法: 5 张 5 元,2 张 2 元,71 张 1 元
100 块钱有如下分法: 5 张 5 元,1 张 2 元,73 张 1 元
100 块钱有如下分法: 5 张 5 元,0 张 2 元,75 张 1 元
100 块钱有如下分法: 4 张 5 元,3 张 2 元,74 张 1 元
100 块钱有如下分法: 4 张 5 元,2 张 2 元,76 张 1 元
100 块钱有如下分法: 4 张 5 元,1 张 2 元,78 张 1 元
100 块钱有如下分法: 4 张 5 元,0 张 2 元,80 张 1 元
100 块钱有如下分法: 3 张 5 元,3 张 2 元,79 张 1 元
100 块钱有如下分法: 3 张 5 元,2 张 2 元,81 张 1 元
100 块钱有如下分法: 3 张 5 元,1 张 2 元,83 张 1 元
100 块钱有如下分法: 3 张 5 元,0 张 2 元,85 张 1 元
100 块钱有如下分法: 2 张 5 元,3 张 2 元,84 张 1 元
100 块钱有如下分法: 2 张 5 元,2 张 2 元,86 张 1 元
100 块钱有如下分法: 2 张 5 元,1 张 2 元,88 张 1 元
100 块钱有如下分法: 2 张 5 元,0 张 2 元,90 张 1 元
100 块钱有如下分法: 1 张 5 元,3 张 2 元,89 张 1 元
100 块钱有如下分法: 1 张 5 元,2 张 2 元,91 张 1 元
100 块钱有如下分法: 1 张 5 元,1 张 2 元,93 张 1 元
100 块钱有如下分法: 1 张 5 元,0 张 2 元,95 张 1 元
100 块钱有如下分法: 0 张 5 元,3 张 2 元,94 张 1 元
100 块钱有如下分法: 0 张 5 元,2 张 2 元,96 张 1 元
100 块钱有如下分法: 0 张 5 元,1 张 2 元,98 张 1 元
100 块钱有如下分法: 0 张 5 元,0 张 2 元,100 张 1 元
耗时31毫秒
Wude_S 2010-04-01
  • 打赏
  • 举报
回复
为啥我发的贴子就没人回
。。。。。。。。
keeya0416 2010-04-01
  • 打赏
  • 举报
回复
呀 少输出了些 马上改好
keeya0416 2010-04-01
  • 打赏
  • 举报
回复

class Class1
{
public static void Main(string[] args)
{
PrintHowToDivide(100);
System.Console.ReadKey();
}


public static void PrintHowToDivide(int value)
{
int temp = value;
int five = value / 5;
value %= 5;
int two = value / 2;
value %= 2;
int one = value;
PrintHowToDivide(temp, five, two, one);
}


/*
* value为需要分解的钱,num_five, num_two, num_one 分别为当前的 5 2 1块的张数
*
* */
private static void PrintHowToDivide(int value, int num_five, int num_two, int num_one)
{
System.Console.WriteLine(" {0} 块钱有如下分法: {1} 张 1 元,{2} 张 2 元,{3} 张 5 元",value,num_one,num_two,num_five);
if (num_one == value) return;
if (num_five > 0)
{
if (num_one > 0)
{
PrintHowToDivide(value, num_five - 1, num_two + 3, num_one - 1);
}
else
{
PrintHowToDivide(value, num_five - 1, num_two + 2, num_one + 1);
}
}
else if(num_two > 0)
{
PrintHowToDivide(value, num_five, num_two - 1, num_one + 2);
}
}

}

这下可以了 哈哈 很快的
Howei 2010-04-01
  • 打赏
  • 举报
回复
高人很多啊!
十八道胡同 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 keeya0416 的回复:]
我上边用的是递推,用递归的话会溢出的
[/Quote]
21楼的递归,还在跑...
100要很久
10 一下就出来了
十八道胡同 2010-04-01
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Xml.Linq;

namespace ConsoleCSharp
{


class Program
{

static void Main(string[] args)
{
int[] arrInt = new int[] { 1, 2, 5 };
count(100 , arrInt,"");

}
public static void count(int n, int[] arr,string s)
{
if (n < 0)
return;
if (n == 0)
{
Console.WriteLine(s);
}
for (int i = 0; i <arr.Length; i++)
{
count(n - arr[i], arr,s + arr[i]);
}

}


}
}

用递归来实现
keeya0416 2010-04-01
  • 打赏
  • 举报
回复
我再去写个哈 楼主等等
我菜鸟 你要有耐心
keeya0416 2010-04-01
  • 打赏
  • 举报
回复
呀 搞错了
我那里边还有重复项没扣
看样子递推和递归不太合适
我再琢磨下
大明明德 2010-04-01
  • 打赏
  • 举报
回复
这家伙,哥这菜鸟看这个好晕哪,不明白,递归这东西,我这新手一点都不晓得,不过谢谢你了
keeya0416 2010-04-01
  • 打赏
  • 举报
回复
我上边用的是递推,用递归的话会溢出的
liuyileneal 2010-04-01
  • 打赏
  • 举报
回复

for (int i = 0; i <= 20; i++)
{
for (int j = 0; j <= (100 - 5 * i) / 2;j++ )
{
for (int k = 0; k <= 100 - 5 * i - 2 * j; k++)
{
if (5 * i + 2 * j + k == 100)
{
Console.WriteLine(i + " " + j + " " + k);
}
}
}
}
keeya0416 2010-04-01
  • 打赏
  • 举报
回复

//f(n) = f(n-5) + f(n-2) + f(n-1);
//任何数量 n 的钱,可有有3种方式累加到
//1. 由 n-5 的钱 加 5 块得到(大于5时)
//2. 由 n-2 的钱 加 2 块得到(大于2时)
//3. 由 n-1 的钱 加 1 块得到(大于1时)
//如果这里直接用递归的话,效率比较低,当参数比较大时也容易溢出
public static int GetTheNum(int value)
{
int[] nums = {1,2,3,5,8};//这里投机了下 先把1-5块的方式初始化了
if (value < 1) return 0;
if(value < 6) return nums[value-1];

int temp = 0;
while (value - 5 > 0)
{
temp = nums[4] + nums[3] + nums[0];
for (int i = 0; i < 4; i++)
{
nums[i] = nums[i + 1];
}
nums[4] = temp;
value--;
}
return temp;
}

楼主 我打印语句没加呢 你先看看这个
我再琢磨下怎么把打印也给加进去 我也菜鸟 呵呵
大明明德 2010-04-01
  • 打赏
  • 举报
回复
我一直在等哪,
加载更多回复(19)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧