商品和活动的二维组合全排列
场景:有m个商品,每个商品有0-n个活动(立减或优惠券),每个商品只能使用一种活动,A商品的A1活动可能和B商品的B2活动存在冲突。求出优惠金额最大的组合?
思路:先求出所有组合的全排列,再根据规则过滤有冲突的组合,对剩余组合对优惠金额排序,求出目标值。
重点:求出所有组合全排列的算法。
为了简化算法,假定每种商品都有n个活动(不足补空值),则所有组合数为 m^n,再获取每种组合的具体组合信息即可。
为了说明思路,用整型二维数组演示(实际应用可将m个商品的所有活动转为二维数组):
@Test
public void testAllCombination(){
//测试数组 表示m=3个商品,每个商品都有n=3个活动
int a[][] = {{1 , 2 , 3 },{4 , 5 , 6 },{7 , 8 , 9}};
int n = a[0].length];
String combinationStr;
//总循环次数,控制循环量
int it = (int) Math.pow((a[0].length),(a.length)) -1;//因数组开始下标=0,减1目的是为了下标取值
while(it >= 0){//组装每种组合
combinationStr = "";
//临时变量,保存迭代器
int temp = it;
for(int m = 0 ; m < a.length ; m++){//每种组合有m个值
combinationStr = combinationStr + a[m][temp % n;//取值
temp = temp / n;
}
System.out.println(combinationStr);//输出每种组合
it--;
}
}//while
输出:
369
269
169
359
259
159
349
249
149
368
268
168
358
258
158
348
248
148
367
267
167
357
257
157
347
247
147