我的思路是:
100=500?
100+200=500?
..
100+200+300+400+500=500?200=500?
200+300=500?
..
200+300+400+500=500?300=500?
300+400=500?
..
300+400+500=500?
.
.
500=500?
用2次循环
a=500;
sum=0;p
b={100,200,300,400,500}
for(i=1;i<b.len;i++)
{
if (b[i]==1)
{ ----ok----- }
for(j=i;j<b.len;j++)
{
sum=sum+b[j]
if (sumn==a)
{-------ok--------}
}
sum=0
}对不起,c#语法忘的差不多了
100=500?
100+200=500?
..
100+200+300+400+500=500?200=500?
200+300=500?
..
200+300+400+500=500?300=500?
300+400=500?
..
300+400+500=500?
.
.
500=500?
用2次循环
a=500;
sum=0;p
b={100,200,300,400,500}
for(i=1;i<b.len;i++)
{
if (b[i]==1)
{ ----ok----- }
for(j=i;j<b.len;j++)
{
sum=sum+b[j]
if (sumn==a)
{-------ok--------}
}
sum=0
}对不起,c#语法忘的差不多了
解决方案 »
- 关于Winform获取系统程序集的问题
- 关于一个datagrid取单元格数据的问题。
- 关于数据处理的问题?
- 在使用XSD定义xml文档得时候,如何定义某个元素必须要有值,而不能为空
- 感谢“lkk2073 (三楼楼长)”的OA!!!不过有个问题!!!请高人指点!!!
- 在VS2008里用C#如何开发三层式WindowsForms程序?
- C#如何同时播放背景音乐和音效
- VS2008中 C# winform 下开发的水晶报表显示出来的数据为什么不能够在报表上直接选中复制?怎么解决?
- 请问哪里可以下载到VisualStudio.net?
- 咨询一个关于C#Rdlc报表的问题
- 高分求OLE DB .NET下的完整的数据库错误代码和相应的提示信息。
- 菜鸟问题:请问各位C#中的类库源代码如何查看?
我上面的没有考虑3的相加,4个的相加,5.6.......
不过你里面执行会是这样
100+200=500?
100+200+300=500?
100+200+300+400=500?
100+200+300+400+500=?
是吗?那就不好了,你少了检查100+300=500?
我觉得应该把你的方法和我的方法集合起来!
对于这5个数中的每一个数而言,只存在着两种情况,即选中与不选中。
定义选中状态为'1',不选中状态记为'0'。这样的排列组合共有2的5次方-1种情况
即 0 0 0 0 1 (代表只选中500)
0 0 0 1 0 (代表只选中400)
0 0 0 1 1 (代表只选中400,500)
.....
1 1 1 1 1 (代表5个数全选中)如存在某种组合 a,b,c,d,e (a,b,c,d,e只可能是0或1),
使得a*100+b*200+c*300+d*400+e*500=800,则这种组合合符条件。
而 把 00001当二进制数看,其值为1
把 00010当二进制数看,其值为2
.....
把 11111当二进制数看,其值为31所以可以这样处理
for(int i=1;i<31;i++)
{
1.把i翻译成2进制数格式的字符串 (下面的代码中通过过程TenToTwo实现)
2.计算a*100+b*200+c*300+d*400+e*500的值
(其中a,b,c,d,e是上述翻译成2进制数格式的字符串的第0到第4位的值)
3.判断
}
代码如下:
int source=800;
int[] basenum=new int[5]{100,200,300,400,500}; int n=5;//5个数字
int times=1;
for(int i=1;i<=n;i++)
times*=2;//不知有没有求x的y次方函数 string tempstr="";
for(int i=1;i<=times-1;i++)
{
tempstr=TenToTwo(i,n) ;
int sum=0;
for(int j=1;j<=n;j++)
{
if(tempstr.Substring(j-1,1)=="1")
sum=sum+basenum[j-1];
}
if(sum==source)
MessageBox.Show(tempstr);
}
十进制到二进制函数
private string TenToTwo(int x,int length)
{
int modnum;
string returnstring="";
while (x>0)
{
modnum=x % 2;
x=(int)(x/2);
returnstring=modnum.ToString()+returnstring;
}
length=length-returnstring.Length;
for(int i=1;i<=length;i++)
{
returnstring="0"+returnstring;
}
return returnstring;
}上述代码运行结果:
弹出3种组合: 00101,10110,11001
00101表示选中300+500=800 ......