算法:微信拼手气红包的红包金额分配算法的Java实现

22 篇文章 1 订阅
20 篇文章 0 订阅

微信拼手气红包,大家都体验过吧,多的就不说了,直接上代码:

import java.util.*;

/**
 * 微信红包金额分配
 * @Author: LiYang
 * @Date: 2019/9/7 13:33
 */
public class RedPacketPuzzle {

    /**
     * 微信拼手气红包金额分配方案(输出结果为分,一分钱的分)
     * @param cent 红包金额的分,5元钱就是500分
     * @param person 抢红包的人数
     * @return 红包金额分配方案
     */
    public static List<Integer> moneyDistributor(int cent, int person){
        if (cent <= 0){
            throw new RuntimeException("红包金额应该是正数!");
        }

        if (person <= 0){
            throw new RuntimeException("至少需要一个人来抢吧!");
        }

        if (cent < person){
            throw new RuntimeException("钱不够分啊,老铁!");
        }

        //所有的分隔符号的集合
        List<Integer> divideMark = new ArrayList<>();

        //加入分隔符
        for (int i = 1; i < cent; i++) {
            divideMark.add(i);
        }

        //乱序分隔符,以求得随机
        Collections.shuffle(divideMark);

        //所需的分隔符号集合
        List<Integer> divideList = new ArrayList<>();

        //抽取我们所需要的分隔符
        for (int i = 0; i < person - 1; i++) {
            divideList.add(divideMark.get(i));
        }

        //分隔符从小到大排序
        Collections.sort(divideList);

        //末尾加入虚拟分隔符
        divideList.add(cent);

        //分钱方案
        List<Integer> solution = new ArrayList<>();

        //前一个分隔符
        int previous = 0;

        //遍历分隔符,求钱数
        for (Integer divider : divideList){

            //得到相邻两个分隔符之间的钱
            solution.add(divider - previous);

            //更新前一个分隔符
            previous = divider;
        }

        //返回微信拼手气红包的金额分配方案
        return solution;
    }

    /**
     * 开始抢红包了
     * @param args
     */
    public static void main(String[] args) {

        //红包金额的分(一分钱的分)
        int cent = 500;

        //抢红包的人数
        int person = 7;

        //生成10次分配方案
        for (int i = 1; i <= 10; i++) {
            System.out.println("分配方案" + i + ":" + moneyDistributor(cent, person));
        }
    }

}

如果是7个人抢5元钱,则控制台输出如下分配方案(如果是N,就代表N分钱,下同):

分配方案1:[68, 122, 110, 53, 66, 44, 37]
分配方案2:[26, 204, 50, 20, 13, 63, 124]
分配方案3:[74, 18, 27, 126, 104, 51, 100]
分配方案4:[104, 86, 124, 11, 31, 4, 140]
分配方案5:[95, 278, 26, 46, 7, 31, 17]
分配方案6:[4, 79, 230, 5, 21, 7, 154]
分配方案7:[53, 76, 291, 33, 5, 38, 4]
分配方案8:[12, 259, 12, 9, 25, 172, 11]
分配方案9:[173, 45, 35, 68, 19, 159, 1]
分配方案10:[334, 20, 7, 27, 38, 36, 38]

如果是7个人抢7分钱:

分配方案1:[1, 1, 1, 1, 1, 1, 1]
分配方案2:[1, 1, 1, 1, 1, 1, 1]
分配方案3:[1, 1, 1, 1, 1, 1, 1]
分配方案4:[1, 1, 1, 1, 1, 1, 1]
分配方案5:[1, 1, 1, 1, 1, 1, 1]
分配方案6:[1, 1, 1, 1, 1, 1, 1]
分配方案7:[1, 1, 1, 1, 1, 1, 1]
分配方案8:[1, 1, 1, 1, 1, 1, 1]
分配方案9:[1, 1, 1, 1, 1, 1, 1]
分配方案10:[1, 1, 1, 1, 1, 1, 1]

如果是7个人抢8分钱:

分配方案1:[2, 1, 1, 1, 1, 1, 1]
分配方案2:[1, 1, 1, 1, 1, 2, 1]
分配方案3:[1, 1, 1, 1, 1, 1, 2]
分配方案4:[1, 1, 1, 1, 2, 1, 1]
分配方案5:[1, 1, 2, 1, 1, 1, 1]
分配方案6:[1, 1, 1, 1, 2, 1, 1]
分配方案7:[1, 1, 1, 1, 2, 1, 1]
分配方案8:[2, 1, 1, 1, 1, 1, 1]
分配方案9:[1, 1, 1, 1, 2, 1, 1]
分配方案10:[1, 1, 1, 1, 1, 1, 2]

如果是7个人抢9分钱:

分配方案1:[1, 1, 1, 1, 1, 2, 2]
分配方案2:[1, 1, 1, 1, 3, 1, 1]
分配方案3:[1, 1, 3, 1, 1, 1, 1]
分配方案4:[1, 1, 2, 1, 1, 2, 1]
分配方案5:[2, 1, 1, 1, 2, 1, 1]
分配方案6:[1, 2, 1, 1, 1, 1, 2]
分配方案7:[2, 1, 1, 1, 1, 2, 1]
分配方案8:[2, 1, 2, 1, 1, 1, 1]
分配方案9:[1, 2, 2, 1, 1, 1, 1]
分配方案10:[2, 2, 1, 1, 1, 1, 1]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值