本帖最后由 lipingan0520 于 2013-5-12 14:15 编辑
- /**
- 可以实现此功能,大家慢慢欣赏。
- */
- class Test113
- {
- public static void main(String[] args)
- {
- xiaoMing(7,3);
- }
-
- public static void xiaoMing(int m,int n)
- {
- int sum = 0;
- int conut = n;
- if(n <= m)
- {
- for(int i = 1 ; i <= n;i++)
- {
- sum = sum + mathPow(2,i-1);
- if(sum >= m)
- {
- show(i,m,n,conut);
- break;
- }
- }
- }
- if(!(sum >= m))
- {
- System.out.print("\n答案NO!\n\n");
- System.out.println("不能分成"+n+"份");
- }
- }
- public static void show(int num , int m , int n , int conut) //把所用的可能性都算出来
- {
- int[][] arr = new int[m-num+1][m];//定义个2维数组,存储所有可以的组合
- for(int i = 0 ; i < m-num+1 ; i++)
- {
- for(int j = 0 ; j < num+i ; j++)
- {
- if(i == 0) //将第一行的数进行赋值,这样就能算出第二行来
- {
- if(j < num) arr[i][j] = mathPow(2,j);
- if(j == num-1)
- {
- int k = 0 , sum = k;
- for(k = 0; k < num-1 ; k++)
- {
- sum = sum + arr[i][k];
- }
- arr[i][k] = m - sum;
- }
- }
- else //算第一行后面的n行数
- {
- if(j == 0) arr[i][j] = 1;
- else
- {
- if(j == num+i-1)
- {
- int k = 0 , sum = 0;
- for(k = 0 ; k < num+i-1 ; k++)
- {
- sum = sum + arr[i][k];
- }
- arr[i][k] = m - sum ;
- }
- else if(arr[i-1][j] == arr[i][j-1])
- {
- arr[i][j] = arr[i-1][j];
- }
- else if(arr[i-1][j] != arr[i][j-1])
- {
- if(arr[i-1][j] < arr[i][j-1])
- arr[i][j] = arr[i-1][j];
- else
- arr[i][j] = arr[i-1][j] - arr[i][j-1];
- }
-
- }
- }
-
- }
- }
- print(arr,num,conut,m);// 算好后的数组,最小分成金条数,要输出的金条数
- }
- public static void print(int[][] arr , int num , int conut , int m)//最后按格式输出
- {
- System.out.print("\n答案YES!\n\n可以分成"+conut+"份,最佳分法: ");
- for(int i = 0 ; i < conut ; i++)
- System.out.print(arr[conut - num][i]+"/"+m+"、");
- System.out.println();
- }
- public static int mathPow(int a,int b)//求幕
- {
- if(b == 0) return 1;
- for(int i = a ; i <= b ; i++)
- {
- a=a*2;
- }
- return a;
- }
- }
复制代码 |