牛客网 幸运的袋子

简介: 牛客网 幸运的袋子

题目链接幸运的袋子__牛客网 (nowcoder.com)

幸运袋子条件:球球的和 > 球球的积

题目:给定一定数量的球球,让你判断能组成多少种幸运的袋子

方法:循环+递归

思路假设


e4fa8de6d24a447e9c5ebe56cfc88efb.png

c48ed739a824475ab02894283f99525c.png


25266fd53eb443f792624d7a819950a8.png


通过这样递归+回溯的方法 ,不断进行到最后,我们可以得到,成立的结果有  

1  1,1  1  3,1  1  5,1  1  7,1  3,1  5,1  7。共计七种。

代码实现


import java.util.*;
public class Main{
    //main方法里的内容还是简单的输入输出
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i]=scanner.nextInt();
        }
        Arrays.sort(arr);
        int ret = work(arr,0,arr[0],arr[0]);//开始是从 arr[0]开始的
        System.out.println(ret);
    }
    // arr存放球球的值,len是arr的大小,pos 是当前位置,sum 当前位置的和,multi当前位置的积
    public static int work(int[] arr,int pos,int sum,int multi){
        int ret = 0;//用来记录幸运袋子的个数,也是最后的返回值
        for(int i=pos+1;i<arr.length;i++){
            sum = sum + arr[i];
            multi = multi * arr[i];
            if(sum>multi){
                //成立,继续向下进行递归
                ret = ret + 1 + work(arr,i,sum,multi);
            }else {
                //不成立,直接break
                break;
            }
            //这里进行回溯,因此要还原 sum 和 multi
            sum = sum - arr[i];
            multi = multi / arr[i];
            //还原之后 继续正常向后走
            //由于题中说 球球并无差别,因此要把相同号码的情况给排除
            while(i+1<arr.length && arr[i]==arr[i+1]){
                i++;
            }
        }
        //循环结束 也就走了(遍历)了一遍,直接返回最后的值
        return ret;
    }
}


相关文章
|
前端开发
牛客网DAY2(编程题)
牛客网DAY2(编程题)
69 0
|
算法 C++ Python
【每日算法Day 107】面试必考:良心推荐,一题三解,不看后悔一辈子
【每日算法Day 107】面试必考:良心推荐,一题三解,不看后悔一辈子
140 0
|
双11 C语言
【牛客刷题】/*开胃菜——简单四道编程题*/
【牛客刷题】/*开胃菜——简单四道编程题*/
212 0
|
存储 程序员
【1024程序员节福利!!!】牛客网小练习
【1024程序员节福利!!!】牛客网小练习
【1024程序员节福利!!!】牛客网小练习
|
算法 搜索推荐
对于蓝桥你不得不知的应试技巧
本文适用于蓝桥杯算法比赛赛前使用
326 0
对于蓝桥你不得不知的应试技巧
【蓝桥真题6】三十块的蓝桥省赛模拟真题,做的大一都直呼上当(文末PDF原题)(上)
【蓝桥真题6】三十块的蓝桥省赛模拟真题,做的大一都直呼上当(文末PDF原题)
253 0
|
存储 测试技术
【蓝桥真题6】三十块的蓝桥省赛模拟真题,做的大一都直呼上当(文末PDF原题)(下)
【蓝桥真题6】三十块的蓝桥省赛模拟真题,做的大一都直呼上当(文末PDF原题)
127 0
|
安全 测试技术
【蓝桥真题6】三十块的蓝桥省赛模拟真题,做的大一都直呼上当(文末PDF原题)(中)
【蓝桥真题6】三十块的蓝桥省赛模拟真题,做的大一都直呼上当(文末PDF原题)
205 0
|
算法 Java
【蓝桥杯】写给零基础入坑蓝桥杯的同学(历届真题解析)
【每日一题】 蓝桥杯的题目很好,把这些算法掌握好,为将来的软件开发打下坚实的基础。 报考比赛的学员均来源于清华北大等以内的一千二百余高等学校,总计数十万学子积极主动报名赛事,因而百度、IBM等大厂竞相参加,为优质的你提供工资待遇丰富的岗位。
|
存储 算法 程序员
算法笔试模拟题精解之“苹果收获程序”
因为每次下落时,苹果树每一层的节点都会往下掉一层。由此可以想到,如果苹果树某一层的节点的数目为奇数时,这一层的节点的苹果掉落到第一层时,由于一个节点只能存储一个二进制位的原因,只会剩下一个苹果。而如果苹果树某一层的节点数目为偶数,这一层的节点的苹果掉落到第一层时,剩下的苹果数目为0。
算法笔试模拟题精解之“苹果收获程序”

相关实验场景

更多