有十个数,任取其中N个(N从1到10),使他们之和大于等于M,如何用C/C++编程求出所有组合并记录。

作者&投稿:经哀 (若有异议请与网页底部的电邮联系)
c/c++问题:输入2个数m,n,从1,2,3,...n这n个数中取若干个使其和等于m,求所有可能的结果?~

void GetSum(int st[],int sindex,int sum,int arr,int m,int n){
if(sum>m) return;
if(sum==m){
for(int i=0;i<sindex;i++) std::cout<<st[i]<<" ";
std::cout<<std::endl;
return;
}
if(arr>n) return;
st[sindex]=arr;
GetSum(st,sindex+1,sum+arr,arr+1,m,n);
GetSum(st,sindex,sum,arr+1,m,n);

return;
}

int st[10];
int m=20,n=10;
GetSum(st,0,0,1,m,n);

#include
int Fabricate(int m,int n);
int multi(int m,int n);
void main()
{
int m,n,answer;
printf("输入m(按q退出):");
while(scanf("%d",&m))
{
printf("输入n:");
scanf("%d",&n);
if(n!=0&&m!=0)//判断m,n是否为0
{
if(m>n) //自动将大数设置为m,小数设置为n
printf( "%d
", Fabricate(m,n));
else
printf( "%d
", Fabricate(n,m));
printf("输入m(按q退出):");
}
else
printf("错误!重新输入,输入m:");

}

}
int Fabricate(int m,int n)
{
int sum_m=1,sum_n=1,sum_mn,sum;
int i=m,j=n;
for(int i=m;i>0;i--)//求m的阶乘
sum_m*=i;
for(int j=0;j>0;j--)//求n的阶乘
sum_n*=j;
sum_mn=multi(m,n);
return (sum_m/sum_n)*sum_mn;

}
int multi(int m,int n)
{
int sum=1;
int k=m-n;
while(k>0)
sum*=k--;
return sum;
}

这个题目要求出并记录所有组合,所以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时,再减小将不满足条件,输出完毕。

还有什么疑问,再追问

你查查关于排列组合的做法,找到所有组合,求和,删选,即可。

j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); 用这个来取1-10之间的随机数


从1,2,3,4,5,6,7,8,9中任取n个数,并总能从其中找出若干个数的和能被...
4.n的最小值为5 证明如下:应想到,被10整除意味着n个数中任意取出来的数之和只能为10 20 30 40.(1)首先用特殊法排除:n取1,2,3,4都不满足条件:若n取4,则取这四个数为9,8,7,6 这4个数中,10<任意两数之和<20,30<任意三数之和<40,所以无论怎么取都不可能取出被10整除的...

从连续自然数1,2,3,…,2008中任意取n个不同的数.
于是m1+2009-m1+k1+2008-k1=4017.(2)不成立.当n=1006时,不妨从1,2,…,2008中取出后面的1006个数:1003,1004,2008,则其中任何四个不同的数之和不小于1003+1004+1005+1006=4018>4017;当n<1006时,同样从1,2,2008的n个数,其中任何4数之和大于1003+1004+1005+1006=4018>4017...

什么是容斥原理,什么是抽屉原理?
抽屉原理:桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个...

从数字1,2,……,9中可重复的任取n次,求n次所取数字的乘积能被10整除的...
n次选择的方法总共有9n种,其中 1、每一次均不取5的取法,有8的N次方种;2、每一次均不取偶数的取法,有5的N次方种;3、每一次均在{1,3,7,9}中取数的方法有4 的N次方种,显然种类3中的取法既包含于种类1,也包含于种类2,所以,取n个数之积能被10整除的概率是:1 - ((8^n + 5^...

...3,4,…,15,16这十六个自然数中,任取出n个数,其中必有这样的两个数...
6)、(4,12)、(5,15)共有4组,其余7个数每一个数为一组,即将这16个数可分为11组,.则第一组最多取2个即1和9,其余组最多取一个,即最多能取12个数保证没有一个数是另一个的三倍,此时只要再任取一个,即取12+1=13个数必有一个数是另一个数的3倍. 所以n最小是13.

从1到9这九个数任取n次,各数想乘后是10的倍数的概率
很简单,只有取得数字中含有同时含有2、5或者其倍数的时候,才会出现10的倍数,具体而言:其中一个为必须为2、4、6或者8,另外一个必须为5。那么,在9个数字中,任取n次的机会是9^n;至少有一个是2的倍数的几率是:[1-(5\/9)^n];至少有一次取到5的倍数的几率是:[1-(8\/9)^n];同时...

...3,4,…,15,16这十六个自然数中,任取出n个数,其中必有这样的两个数...
这个题不算难 首先咱们把所有符合3倍这个条件的每一对都挑出来 1、3 2、6 3、9 4、12 5、15 那么除了这些数之外,还剩下7、8、10、11、13、14、16 那么我们必须满足的条件是随便抽都能抽中上面六组中的一组,也就是说首先要保证每一组都有一个 所以答案应该是7+5=12 n最小为12 ...

在自然数1,2,3,…中,任意取出n个不同的数必有两个数的差为7,则n的最...
N = 8 根据鸽巢原理(抽屉原则)至少取8个数字(连续的8个数),必能保证其中有两个数的差为7。

从连续自然数1,2,3……2008中任意取n个不同的数
当n≤1006(n是正整数)时,上述结论不成立

1~9九个数中随机抽取n个数,其中n个数的和必能被10整除,n的最小值?
解:楼主打错了吧,现在的条件下n肯定没有最小值,例如 10001个1,10000001个1之类的,n很明显可以取无穷大。楼主是想说“1~9九个数中随机抽取n个数,其中必有10个数的和能被10整除,n的最小值?”吗?

来宾市13389435172: 有十个数,任取其中N个(N从1到10),使他们之和大于等于M,如何用C/C++编程求出所有组合并记录. -
笪祥匹多: 这个题目要求出并记录所有组合,所以for循环是省不了的,但是可以做到不无脑.首先分析一下题目,设取出的N个数和为y,那么可以得出:y的最大值为 i+(i-1)+(i-2)+···+(i-N+1) 进行检定:如果y的最大值小于M,那么无解;否则,y的最大...

来宾市13389435172: 从1到10这十个数中取出若干个数,使它们的和为奇数的取法有 - 种
笪祥匹多: 设取出n个数,则2&lt;=n&lt;=10, n=2时, 先取一奇数C(5,1),再取一偶数C(5,1), 即共5*5=25种; n=3时, 先取一奇数C(5,1),再取二偶数C(5,2), 或取三奇数C(5,3), 即共5*10+10=60种; n=4时, 先取一奇数C(5,1),再取三偶数C(5,3), 或先取三...

来宾市13389435172: 一个袋中有20个大小相同的小球,其中记上0号的有10个,记上n号的有n个(n=1,2,3,4).现从袋中任取一 -
笪祥匹多: (1)由题设知ξ=0,1,2,3,4,P(ξ=0)=1020 =12 ,P(ξ=1)=120 ,P(ξ=2)=220 =110 ,P(ξ=3)=320 ,P(ξ=4)=420 =15 ,∴ξ的分布列为:ξ 0 1 2 3 4P1212011032015 …(3分) ∴Eξ= 0*12 +1*120 +2*110 +3*320 +4*1...

来宾市13389435172: 概率统计的一道题一整数n等可能地在1,2,3,…,10十个数中取一个值.设d是能整除n的正整数的个数,f是能整除n的素数的个数,试求d与f的联合分布律.文登书... -
笪祥匹多:[答案] 你搞反了,是1能整除所有的正整数.

来宾市13389435172: 在1到100这100个数中任取其中的N个数,要使这N个数中至少有一个合数,则N至少是? -
笪祥匹多: 1到100有74个合数,要使任取N个数,至少有一个是合数,则N至少为100-74+1=27

来宾市13389435172: 试证明从1到20这20个自然数中,随意取11个数,必有两个数,其中一个数是另一个数的倍数 -
笪祥匹多: 构造集合: S1:(1,2,3,4,5,6,7,8,9,10..19,20) S2:(2,4,6,8,10,12,14,16,18,20) S3:(3,6,9,12,15,18) S4:(4,8,12,16,20) S5:(5,10,15,20) S6:(6,12,18) S7:(7,14) S8:(8,16) S9:(9,18) S10:(10,20) 1到20中所有数都在集合 且一个集合中最多只能取一个数,使任一个数都不是另一个数的倍数. 此时已取10个数,再取1个数,必有两数在同一集合中. 此题得证.

来宾市13389435172: 从1到9这九个数任取n次,各数想乘后是10的倍数的概率 -
笪祥匹多: 很简单,只有取得数字中含有同时含有2、5或者其倍数的时候,才会出现10的倍数,具体而言: 其中一个为必须为2、4、6或者8,另外一个必须为5. 那么,在9个数字中,任取n次的机会是9^n;至少有一个是2的倍数的几率是:[1-(5/9)^n];至少有一次取到5的倍数的几率是:[1-(8/9)^n];同时满足二者的几率是:[1-(5/9)^n][1-(8/9)^n].

来宾市13389435172: 2n个数取n+1至少有一个是另一个的倍数 -
笪祥匹多: 在这2n个数中取n个,且彼此间无倍数关系的唯一取法是:n+1,n+2,n+3,......2n 若取第n+1个数时,必然在1至n中取出,而其中每一数都在后n个数中有其倍数, 由此得证.

来宾市13389435172: 从连续自然数1、2、3.....2014中取出n个数,使这n个数满足:任意取其中两个数,不会有一个 -
笪祥匹多: 1

来宾市13389435172: 从1、2、3……9中可重复的任取n次,求n次所取数字的乘积能被10整除的概率 -
笪祥匹多: 要使n个数之积被10整除,必须有一个数是5,有一个数是偶数. n次选择的方法总共有9n种,其中 A.每一次均不取5的取法,有8的N次方种; B.每一次均不取偶数的取法,有5的N次方种; C.每一次均在{1,3,7,9}中取数的方法有4 的N次方种,显然C中的取法既包含于A,也包含于B,所以,取n个数之积能被10整除的概率是1 - ((8的N次方 + 5的N次方 - 4 的N次方)/ 9的N次方)

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网