/* 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();
}
}
[Java] Healthy Holsteins
猜你喜欢
转载自blog.csdn.net/weixin_41714373/article/details/112687554
今日推荐
周排行