洛谷链接:https://www.luogu.com.cn/problem/P1460
import java.util.Scanner;
public class Main {
static int[] ans=new int[1001]; //这个数组是来存储解的。
static int[] a=new int[1001]; //表示牛每天需要的每种维他命的最小量。
static int[][] b=new int[1001][1001]; //每种饲料包含的各种维他命的量的多少。
static int[] c=new int[1001]; //每次搜索选的饲料编号
static int n,m,minn=100000000;
//这是判断每次选的那些饲料中的维生素之和是不是都大于等于牛每天需要的每种维他命的最小量的函数
public static boolean pd(int s) {
for(int i=1; i<=n; i++) {
int sum=0; //换一种饲料就清0
for(int j=1; j<=s; j++) {
sum+=b[c[j]][i]; //用一个sum累加
}
if(sum<a[i]) return false; //如果有一项维生素比牛需要的维生素要少,直接返回false
}
return true;
}
//如果新的数在整个数组范围内并且不是障碍(能走),那么就搜索从这个格子能走到其他哪些格子
//t表示搜索到了第t种饲料,s表示目前选的饲料的总数
public static void dfs(int t,int s) {
if(t>m) { //到达边界,将全部饲料从头到尾搜过一遍
if(pd(s)) { //满足牛的最小需求
if(s<minn) { //判断选的饲料的总数小于以前的最优解
minn=s; //改变最优解
for(int i=1;i<=minn;i++) {
ans[i]=c[i];
}
}
}
return;
}
c[s+1]=t; //保存每次搜索时的饲料编号
dfs(t+1,s+1); //加上当前饲料的结果,继续搜索
c[s+1]=0; //回溯一步
dfs(t+1,s); //不 加上当前饲料的结果,继续搜索
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//输入
//n种维生素
n=in.nextInt();
for(int i=1;i<=n;i++) {
a[i]=in.nextInt();
}
//m种饲料
m=in.nextInt();
for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++) {
b[i][j]=in.nextInt();
}
}
dfs(1,0);
System.out.print(minn+" ");
for(int i=1;i<=minn;i++) {
System.out.print(ans[i]+" ");
}
}
}