永发信息网

如何用C++实现从m个数当中选n个组合

答案:2  悬赏:80  手机版
解决时间 2021-02-11 19:44
Securing the Barn

Time Limit: 1 Seconds Memory Limit: 32768 K

Total Submit:42 Accepted:16

--------------------------------------------------------------------------------

Description

Farmer John has installed a new security system on the barn and now must issue a valid password to the cows in the herd. A valid password consists of L (3 <= L <= 15) different lower-case characters (from the traditional latin character set 'a'...'z'), has at least one vowel ('a', 'e', 'i', 'o', or 'u'), at least two consonants (non-vowels), and has characters that appear in alphabetical order (i.e., 'abc' is valid; 'bac' is not).
Given a desired length L along with C lower-case characters, write a program to print all the valid passwords of length L that can be formed from those letters. The passwords must be printed in alphabetical order, one per line.

Input

* Line 1: Two space-separated integers, L and C
* Line 2: C space-separated lower-case characters that are the set of characters from which to build the passwords

IMPORT:

To avoid get Wrong Answer, Please use gets() (C) or cin (C++) instead of scanf("%c") or getchar() to receive input.

Output

* Lines 1..?: Each output line contains a word of length L characters (and no spaces). The output lines must appear in alphabetical order.

Sample Input

4 6
a t c i s w

Sample Output

acis
acit
aciw
acst
acsw
actw
aist
aisw
aitw
astw
cist
cisw
citw
istw

Hint

INPUT DETAILS:
Passwords of length 4 chosen from the given six characters
最佳答案
这个题目要求出并记录所有组合,所以for循环是省不了的,但是可以做到不无脑。

首先分析一下题目,设取出的n个数和为y,那么可以得出:
y的最大值为 i+(i-1)+(i-2)+···+(i-n+1)
进行检定:如果y的最大值小于m,那么无解;否则,y的最大值肯定满足条件,使用for循环,依次逐渐减小n个数的值,直至y=m,则输出了所有解。

代码我就不写了,算法如上,再举例说明一下最后中情况for循环的思路,就拿楼主的例子说明:
“十个数,从1到10,m=15,n=3”
首先,10、9、8必然满足条件,将第三个数从8开始减小,一直到1都满足条件;
然后,减小第二个数,起始为10、8、7,再将第三个数从7开始减小,一直到1都满足条件;
···
最终当循环到6、5、4时,再减小将不满足条件,输出完毕。

还有什么疑问,再追问
全部回答
不好意思,英文我看不懂,不过中文我就懂了 #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> int a[100];//a[0]舍弃不用,a[1]至a[m]存组合数 void zh(int n,int m,int num) { int i; if(m==num-1) { for(i=1;i<=m;i++) printf("%d ",a[i]); printf("\n"); return; } for(i=a[num-1]+1;i<n+1;i++)//有顺序的排列即为组合 { a[num]=i; //printf("a[%d]=%d\n",num,a[num]); zh(n,m,num+1); } } main() { int n,m; a[0]=0; printf("please input n,m (n>m)\n"); scanf("%d %d",&n,&m); zh(n,m,1); getch(); }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
江浪村地址好找么,我有些事要过去
请问HuAwEITIT-AL00是真华为吗?
2019年知识与能力训练三年级语文上册人教版答
我喜欢了隔壁班的一个男生,但是他从来不理我
植物大战僵尸中的急救箱怎么用
求类似路从今夜白的现代言情小说
凤禾乡我想知道这个在什么地方
黄蜂窝有什么用
连云港贝林贸易有限公司地址在哪,我要去那里
【数学归纳法步骤】数学归纳法的基本步骤
茶山竹海要不要门票呢,可不可以套票,如何套
请问这个集合表示什么意思
我今年39岁离婚了,现在喜欢上一个离婚的女人
美国佑替UT Soothe网上怎么购买?
每张塔罗牌的意义!!!
推荐资讯
灶瓦村地址在哪,我要去那里办事
静心传统修面在什么地方啊,我要过去处理事情
盛利水暖地址有知道的么?有点事想过去
我在网上订机票,网上显示T3航站楼,我应该怎
2019年深圳市小学英语第1课堂五年级上册沪教
朋友来买产品时能一下给最底价吗
摩托车。可以用什么代替自补液。不加自补液可
中国邮政储蓄银行(唐家营业所)地址在哪,我要
原房主找不到怎么过户
男比女少八分之一,男是女的().女是男的(),
陇尚阁炒肉片我想知道这个在什么地方
为什么我玩真实赛车3每次都是我排最后一位呢
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?