Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package abc056d;
- import java.util.*;
- public class ABC056D {
- static int minOf(List<Integer> arr){
- int min = arr.get(0);
- for(int i = 1; i < arr.size(); i++){
- if(arr.get(i) <= min) min = arr.get(i);
- }
- return min;
- }
- static int maxOf(List<Integer> arr){
- int max = arr.get(0);
- for(int i = 1; i < arr.size(); i++){
- if(arr.get(i) > max) max = arr.get(i);
- }
- return max;
- }
- static void sort(List<Integer> arr){
- System.out.println("降順に並び替えます");
- List<Integer> arrTmp = new ArrayList<>();
- for(int i = 0; i < arr.size(); i++){
- int tmp = maxOf(arr);
- arrTmp.add(tmp);
- for( int j = 0; j < arr.size(); j++){
- if(arr.get(j) == tmp){
- arr.set(j,minOf(arr)-1);
- break;
- }
- }
- }
- for(int i = 0; i < arr.size(); i++){
- arr.set(i,arrTmp.get(i));
- }
- }
- static void checkArray(List<Integer> arr){
- System.out.println("配列の内容は以下のとおりです。");
- for( int i = 0; i < arr.size(); i++){
- System.out.print(arr.get(i) +" ");
- }
- System.out.println();
- }
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- int N = sc.nextInt();
- int K = sc.nextInt();
- List<Integer> arr = new ArrayList<>();
- for(int i = 0; i < N; i++){
- arr.add(sc.nextInt());
- }
- checkArray(arr);
- /*----------配列の総和がKに達しない場合----------*/
- int sum = 0;
- for(int i = 0; i < arr.size(); i++){
- sum += arr.get(i);
- }
- if(sum < K){
- System.out.println(arr.size());
- }
- /*----------配列中にKに達する部分集合がある場合----------*/
- List<Integer> arrCard = new ArrayList<>();
- for(int i = 0; i < N; i++){
- arrCard.add(1); // 必要なら0、捨てるなら1の配列を作成
- }
- sort(arr); // 降順に並び替え
- checkArray(arr);
- int counter; //配列を捜査するときのカウンター
- int tmpsum; //配列の要素を足したものを入れる
- for(int i = 0; i < N; i++) {
- counter = i;
- tmpsum = 0;
- for(int j = counter ; j < N; j++) {
- if(sum + arr.get(j) >= K) { //要素を足していってj枚目でKを越えたとき
- for(int k = counter; k <= j; k++){
- arr.set(k,0); // それらの要素は必要なカードの部分集合なので0にする
- }
- counter = j; // カウンターをずらしてj枚目する。ループが回って次のカードから走査される
- } else {
- sum += arr.get(i); //要素に満たない間はひたすら足す
- }
- }
- //ループを抜けると次の要素から走査されて、部分集合が見つかる
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement