商品和活动的二维组合全排列

商品和活动的二维组合全排列

场景:有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值