引用自javaeye的算法

http://www.javaeye.com/topic/88204


  1. package com.maodajun.javaeye1;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. public class BaiDuQuest {
  6. public String teamAndImpossable(int peoples,int impossable){
  7. int maximpossable= maxImpossable(peoples);
  8. maximpossable -=impossable;
  9. List list =selfTeam(peoples,maximpossable,new ArrayList());
  10. if(list!=null){
  11. return "YES";
  12. }
  13. return "NO";
  14. }
  15. //递归算出最大可能。。。循环赛制
  16. public int maxImpossable(int poples){
  17. if(poples==2){
  18. return 1;
  19. }else if(poples<1){
  20. return 0;
  21. }
  22. poples--;
  23. return maxImpossable(poples)+poples;
  24. }
  25. public int maxFirstTeam(int peoples, int maximpossable){
  26. int tmp = 0 ;
  27. if(maxImpossable(peoples)
  28. return -1;
  29. }
  30. for(int i = peoples ; i >1 ; i--){
  31. tmp = maxImpossable(i);
  32. if(tmp <= maximpossable){
  33. return i;
  34. }
  35. }
  36. return tmp;
  37. }
  38. public List selfTeam(int peoples , int maximpossable ,List list ){
  39. int max = maxFirstTeam(peoples,maximpossable);
  40. if(max==0){
  41. return list;
  42. }else if (max==-1){
  43. return null;
  44. }else{
  45. list .add(""+max);
  46. return selfTeam(peoples-max,maximpossable-maxImpossable(max),list);
  47. }
  48. }
  49. public static void main(String[] arg){
  50. BaiDuQuest quest = new BaiDuQuest();
  51. int people = 5;
  52. for(int i = quest.maxImpossable(people) ; i >=0; i--){
  53. List list =quest.selfTeam(people,i,new ArrayList());
  54. int count = 0 ;
  55. if(list!=null){
  56. for(int j = 0 ; j < list.size(); j ++){
  57. count +=Integer.parseInt(list.get(j).toString());
  58. }
  59. list.add(""+(people-count));
  60. }
  61. System.out.println(quest.maxImpossable(people)-i+":"+list);
  62. }
  63. }
  64. }
请使用浏览器的分享功能分享到微信等