[Java] Healthy Holsteins

/* Use the slash-star style comments or the system won't see your
   identification information */
/*
ID: lincans1
LANG: JAVA
TASK: holstein
*/
import java.io.*;
import java.util.*;

public class holstein {
    
    
	private int V;
	private int G;
	private Set<Integer> ans;
	
	private boolean isEnough(int[] require) {
    
    
		for (int i = 0; i < V; i++) {
    
    
			if (require[i] > 0) {
    
    
				return false;
			}
		}
		return true;
	}

	private void DFS(int[] require, int[][] feed, int index, Set<Integer> set) {
    
    
		if (isEnough(require)) {
    
    
			if (ans.size() > set.size()) {
    
    
				ans = new TreeSet<Integer>(set);
			}
			return;
		}
		if (set.contains(index) || ans.size() <= set.size()) {
    
    
			return;
		}
		for (int i = index; i < G; i++) {
    
    
			set.add(i);

			for (int j = 0; j < V; j++) 
				require[j] -= feed[i][j];
			// backtrace
			DFS(require, feed, i + 1, set);
			for (int j = 0; j < V; j++) 
				require[j] += feed[i][j];

			set.remove(i);
		}
	}

	public holstein() throws IOException {
    
    
		// Use BufferedReader rather than RandomAccessFile; it's much faster
		BufferedReader f = new BufferedReader(new FileReader("holstein.in"));
		PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("holstein.out")));
		
		this.V = Integer.parseInt(f.readLine());
		int[] require = new int[V];
		StringTokenizer st = new StringTokenizer(f.readLine());
		// Use StringTokenizer vs. readLine/split -- lots faster
		for (int i = 0; i < V; i++) {
    
    
			require[i] = Integer.parseInt(st.nextToken());
		}
		
		this.G = Integer.parseInt(f.readLine());
		int[][] feed = new int[G][V];
		for (int i = 0; i < G; i++) {
    
    
			st = new StringTokenizer(f.readLine());
			for (int j = 0; j < V; j++) {
    
    
				feed[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		this.ans = new TreeSet<>();
		for (int i = 0; i < G; i++) {
    
    
			ans.add(i);
		}
		DFS(require, feed, 0, new TreeSet<Integer>());
		out.print(ans.size());
		for (int num : ans) {
    
    
			out.print(" " + (num + 1));
		}
		out.println();
	    out.close();
	    f.close();
	}
	
	public static void main (String [] args) throws IOException {
    
    
		new holstein();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41714373/article/details/112687554