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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值