Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.18 KB | None | 0 0
  1. package abc056d;
  2. import java.util.*;
  3.  
  4. public class ABC056D {
  5.  
  6. static int minOf(List<Integer> arr){
  7. int min = arr.get(0);
  8. for(int i = 1; i < arr.size(); i++){
  9. if(arr.get(i) <= min) min = arr.get(i);
  10. }
  11. return min;
  12. }
  13. static int maxOf(List<Integer> arr){
  14. int max = arr.get(0);
  15. for(int i = 1; i < arr.size(); i++){
  16. if(arr.get(i) > max) max = arr.get(i);
  17. }
  18. return max;
  19. }
  20. static void sort(List<Integer> arr){
  21. System.out.println("降順に並び替えます");
  22. List<Integer> arrTmp = new ArrayList<>();
  23. for(int i = 0; i < arr.size(); i++){
  24. int tmp = maxOf(arr);
  25. arrTmp.add(tmp);
  26. for( int j = 0; j < arr.size(); j++){
  27. if(arr.get(j) == tmp){
  28. arr.set(j,minOf(arr)-1);
  29. break;
  30. }
  31. }
  32. }
  33. for(int i = 0; i < arr.size(); i++){
  34. arr.set(i,arrTmp.get(i));
  35. }
  36. }
  37. static void checkArray(List<Integer> arr){
  38. System.out.println("配列の内容は以下のとおりです。");
  39. for( int i = 0; i < arr.size(); i++){
  40. System.out.print(arr.get(i) +" ");
  41. }
  42. System.out.println();
  43. }
  44.  
  45. public static void main(String[] args) {
  46. Scanner sc = new Scanner(System.in);
  47. int N = sc.nextInt();
  48. int K = sc.nextInt();
  49. List<Integer> arr = new ArrayList<>();
  50. for(int i = 0; i < N; i++){
  51. arr.add(sc.nextInt());
  52. }
  53.  
  54. checkArray(arr);
  55.  
  56.  
  57. /*----------配列の総和がKに達しない場合----------*/
  58. int sum = 0;
  59. for(int i = 0; i < arr.size(); i++){
  60. sum += arr.get(i);
  61. }
  62. if(sum < K){
  63. System.out.println(arr.size());
  64. }
  65.  
  66. /*----------配列中にKに達する部分集合がある場合----------*/
  67. List<Integer> arrCard = new ArrayList<>();
  68. for(int i = 0; i < N; i++){
  69. arrCard.add(1); // 必要なら0、捨てるなら1の配列を作成
  70. }
  71.  
  72. sort(arr); // 降順に並び替え
  73. checkArray(arr);
  74.  
  75. int counter; //配列を捜査するときのカウンター
  76. int tmpsum; //配列の要素を足したものを入れる
  77. for(int i = 0; i < N; i++) {
  78. counter = i;
  79. tmpsum = 0;
  80.  
  81. for(int j = counter ; j < N; j++) {
  82. if(sum + arr.get(j) >= K) { //要素を足していってj枚目でKを越えたとき
  83. for(int k = counter; k <= j; k++){
  84. arr.set(k,0); // それらの要素は必要なカードの部分集合なので0にする
  85. }
  86. counter = j; // カウンターをずらしてj枚目する。ループが回って次のカードから走査される
  87. } else {
  88. sum += arr.get(i); //要素に満たない間はひたすら足す
  89. }
  90. }
  91.  
  92. //ループを抜けると次の要素から走査されて、部分集合が見つかる
  93.  
  94. }
  95.  
  96. }
  97.  
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement