日期:2014-05-20  浏览次数:20595 次

求一算法
请教一个算法,求   a+2b+3c+4d+5e+6f=sum有没有整数解,sum已知,a,b,c,d,e,f的取值范围放在一个数组里,比如:a[6]   =   {1,0,1,2,0,0}   就是说a在[0,1]之间(包括),返回有没有整数解即可,不可以用六重循环,因为a,b,c,d,e,f的和最大要200000,循环起来数目太大了。

------解决方案--------------------
a[6] = {1,0,1,2,0,0} 就是说a在[0,1]之间(包括)
______________________________________________

怎么看出来的,我好像没看懂!!
------解决方案--------------------
取数字小数部分运算?
------解决方案--------------------
可以用sum/2000, sum/2000, sum/10000,....来循环啊
------解决方案--------------------
http://community.csdn.net/Expert/topic/5382/5382888.xml?temp=.7441065

这里有个很牛的,跟楼主的类似.
------解决方案--------------------
饶了我机器吧.....用递归数设大点机器就被秒杀了.
给个递归算法参考一下:print里面注释掉了...没敢开.不知道你用for能忍受到多大数..
public class Calculate {
static int count=0;
int[][] a = { { 6 , 5 , 4 , 3 , 2 , 1 }, // 0
{ 0 , 0 , 0 , 0 , 0 , 0 }, // 1
{ 100, 100, 100, 100, 100, 100 } }; // 2
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
int sum = 500;
Calculate cal = new Calculate();
System.out.println( "[6,5,4,3,2,1]\n ");
cal.split(sum, 0);
System.out.println(count);
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
public void split(int sum, int pos) {
if (pos == 5) {
if (sum <= a[2][pos]) {
a[1][pos] = sum;
//printArray();
count++;
}
} else {
a[1][pos] = sum/a[0][pos] < a[2][pos] ? sum/a[0][pos] : a[2][pos];
while(a[1][pos] > = 0) {
int temp = sum - a[0][pos] * a[1][pos];
pos++;
split(temp, pos);
pos--;
a[1][pos]--;
}
}
}
public void printArray() {
StringBuilder sb = new StringBuilder( "[ ");
for (int i = 0; i < a[1].length; i++) {
sb.append(a[1][i]);
if (i < a[1].length - 1)
sb.append( ", ");
}
sb.append( "] ");
System.out.println(sb);
}
}
这才500...范围100
结果就到了235647020种....

输出:
[6,5,4,3,2,1]
235647020
7359