class Solution {
public int[] packing(int n, int m, int[] a, int[][] bomm){
int[] max = new int[m];
//计算每个bom最多装几个
for (int i = 0; i < m; i++){
int temp = Integer.MAX_VALUE;
for (int j = 0; j < a.length; j++){
if (bomm[i][j] == 0){
continue;
}else if (a[j] / bomm[i][j] < temp){
temp = a[j] / bomm[i][j];
}
}
max[i] = temp;
}
int length = a.length;
int[] left = new int[length];
int[] record = new int[length];
int[] bestLeft = new int[length]; //记录最佳剩余
int[] bestRecord = new int[length]; //记录最佳剩余时,每种bom的个数
for (int i = 0; i < length; i++){
left[i] = a[i];
bestLeft[i] = a[i];
}
dfs(max, left, 0, bomm, record, bestLeft, bestRecord);
return bestRecord;
}
public void dfs(int[] max, int[] left, int iter, int[][] bomm, int[] record, int[] bestLeft, int[] bestRecord){
if (iter >= max.length){
if (best(left, bestLeft)){
makeCopy(bestLeft, left);
makeCopy(bestRecord, record);
return;
}else {
return;
}
}
for (int i = 0; i <= max[iter]; i++){
if (enough(left, bomm[iter], i)){
record[iter] = i;
update(left, bomm[iter], i);
dfs(max, left, iter+1, bomm, record, bestLeft, bestRecord);
restore(left, bomm[iter], i);
}else {
if (best(left, bestLeft)){
makeCopy(bestLeft, left);
makeCopy(bestRecord, record);
return;
}else {
return;
}
}
}
}
public boolean enough(int[] left, int[] bom, int i){
for (int j = 0; j < left.length; j++){
if (left[j] < bom[j] * i){
return false;
}
}
return true;
}
public void update(int[] left, int[] bom, int i){
for (int j = 0; j < left.length; j++){
left[j] -= bom[j] * i;
}
}
public void restore(int[] left, int[] bom, int i){
for (int j = 0; j < left.length; j++){
left[j] += bom[j] * i;
}
}
public boolean best(int[] left, int[] bestLeft){
if (leftKinds(left) < leftKinds(bestLeft)){
return true;
}
return false;
}
//记录剩余商品的种类
public int leftKinds(int[] left){
int lKinds = 0;
int length = left.length;
for (int j = 0; j < length; j++){
if (left[j] != 0){
lKinds ++;
}
}
return lKinds;
}
public void makeCopy(int[] a, int[] b) {
int len = a.length;
for (int i = 0; i < len; i++) {
a[i] = b[i];
}
}
public static void main(String[] args){
Solution solution = new Solution();
// {2,3,1},商品组合bom1{2,1,1},bom2{1,1,0},bom3{0,1,1}
int n = 3;
int m = 3;
int[] a = {2, 3, 1};
int[][] nums = new int[][]{
{2, 1, 1},
{1, 1, 0},
{0, 1, 1}};
System.out.println(Arrays.toString(solution.packing(n, m, a, nums)));
}
}