每日一道算法题数字游戏(蓝桥杯练习系统)全排列问题-创新互联

资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
例如:
3 1 2 4
4 3 6
7 9
16
现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。
输入格式
第1行为两个正整数n,sum
输出格式
一个1~N的一个排列
样例输入
4 16
样例输出
3 1 2 4
数据规模和约定
0解题思路:主要是1~N的整数要怎么排序才能符合这样加起来的和能为sum,这就用到了全排列,而且今天学到了怎么把把数组加成这种阶梯状的值,只要s[j]+=s[j+1],然后总共加n-1次,每次加n-i次,i从1到n

创新互联公司为客户提供专业的成都网站制作、网站建设、外贸网站建设、程序、域名、空间一条龙服务,提供基于WEB的系统开发. 服务项目涵盖了网页设计、网站程序开发、WEB系统开发、微信二次开发、手机网站开发等网站方面业务。
import java.util.Arrays;
import java.util.Scanner;

public class Main{static int n=0;
    static int sum=0;
    static int[] used=new int[11];//用来标记是否使用
    static int[] dp=new int[11];//用来存储每个位置的数字
    public static void main(String[] args){Scanner in=new Scanner(System.in);
        n=in.nextInt();
        sum=in.nextInt();
        Arrays.fill(used,0);
        DFS(1);
    }
    public static void DFS(int step){if(step==n+1){//说明已经列满n个数了,这个时候需要判断和是否为sum
            int s[] =new int[n+1];//防止破坏dp数组里的数,因为如果满足条件需要输出dp数组的内容
            for(int i=1;i<=n;i++){s[i]=dp[i];
            }
            for(int i=1;i//总共加n-1次
                for(int j=1;j<=n-i;j++){//把数组的和全加到j=1的位置上去
                    s[j]+=s[j+1];
                }
            }
            if(s[1]==sum)//满足条件,输出
            {for(int i=1;i<=n;i++){System.out.print(dp[i]);
                    if(ireturn;
            }
        }
        for(int i=1;i<=n;i++){if(used[i]==0){used[i]=1;
                dp[step]=i;
                DFS(step+1);
                used[i]=0;
            }
        }
    }
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧

分享题目:每日一道算法题数字游戏(蓝桥杯练习系统)全排列问题-创新互联
网页地址:https://www.cdcxhl.com/article20/djjgjo.html

成都网站建设公司_创新互联,为您提供关键词优化企业网站制作网站导航标签优化微信小程序网页设计公司

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

绵阳服务器托管