问:有多少种取法?
19 个解决方案
#1
很简单的嘛 1+99 2+98 ...49+51。 49种
#2
这个应该不难啊........,其实就是首尾取数啊,1和99,2和98................伟大的高斯发明的啊.......
至于有多少.....我就不给你答案了....自己想
至于有多少.....我就不给你答案了....自己想
#3
大哥......我还在编辑帖子的...你怎么就抢先手了啊.........
#4
看不动题的就不要来捣乱了。。受不了了。。。234楼都是小学生智商么
#5
1. 100不算,因为它加上任何一个值都不会等于100,所以就剩下1到99这99个数字。
2. 由于必须满足两个数相加等于100,那么如果任意选定第一个数字后,那么第二个数字就确定了,即无需选择了。
3. 根据2,选择第一个数字的可能性有99个,选择第二个数字的可能性只有1个,因此取法有99种。
说实话,俺也不知道看懂题目了木有,如果说错了,就直接无视吧。
2. 由于必须满足两个数相加等于100,那么如果任意选定第一个数字后,那么第二个数字就确定了,即无需选择了。
3. 根据2,选择第一个数字的可能性有99个,选择第二个数字的可能性只有1个,因此取法有99种。
说实话,俺也不知道看懂题目了木有,如果说错了,就直接无视吧。
#6
没说必须是两个数吧???
#7
仅供参考
//求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案
#include <stdio.h>
#include <conio.h>
int Begin,End,Sum;
int j;
int o[1000];
long n;
void combsum(int b,int e,int s,int d) {
int i;
if (e>s) e=s;
for (i=e;i>=b;i--) {
if ((i+b)*(i-b+1)/2<s) break;
o[d]=i;
if (s-i<=0) {
n++;
printf("%8ld:",n);
for (j=0;j<=d;j++) printf("%d ",o[j]);
printf("\n");
} else {
if (d+1<1000) combsum(b,i-1,s-i,d+1);
else {
printf("Error:Too deep.\n");
return;
}
}
}
}
void main() {
clrscr();
printf("Input Begin,End,Sum:");
scanf("%d,%d,%d",&Begin,&End,&Sum);
n=0L;
combsum(Begin,End,Sum,0);
printf("Total:%ld\n",n);
getch();
}
#8
#include<iostream>
#include<string>
using namespace std;
long long ans;
void dfs(int pos,int cnt,int sum,int size){
if(cnt==size){
if(100==sum)
ans++;
return ;
}
for(int i=pos+1;i<=100;++i){
if(i+sum<=100)
dfs(i,cnt+1,sum+i,size);
else
return ;
}
}
int main(){
for(int i=1;i<=100;++i) //枚举选取i个数字构成100
dfs(0,0,0,i);
printf("%I64d\n",ans);
system("pause");
return 0;
}
/*
444793
right?
*/
#9
#include<iostream>
#include<string>
using namespace std;
long long ans;
int select[100];
void dfs(int pos,int cnt,int sum,int size){
if(cnt==size){
if(100==sum){
ans++;
for(int i=0;i<cnt;++i)
printf("%d ",select[i]);
puts("");
system("pause");
}
return ;
}
for(int i=pos+1;i<=100;++i){
if(i+sum<=100){
select[cnt]=i;
dfs(i,cnt+1,sum+i,size);
}
else
return ;
}
}
int main(){
for(int i=1;i<=100;++i) //枚举选取i个数字构成100
dfs(0,0,0,i);
printf("%I64d\n",ans);
system("pause");
return 0;
}
/*
444793
right
*/
#10
你们没看明白啊 要是这么简单楼主就不会来这问了 任意选意思又不是只选两个
#11
楼上两位都是牛人啊
#12
貌似要用动态规划啊 好难啊
#13
你没说是多少个为一组。2个?3个?还是?
#14
1:100
2:99 1
3:98 2
4:97 3
5:97 2 1
6:96 4
7:96 3 1
8:95 5
9:95 4 1
10:95 3 2
11:94 6
12:94 5 1
13:94 4 2
14:94 3 2 1
15:93 7
16:93 6 1
17:93 5 2
18:93 4 3
19:93 4 2 1
20:92 8
21:92 7 1
22:92 6 2
23:92 5 3
24:92 5 2 1
25:92 4 3 1
26:91 9
27:91 8 1
28:91 7 2
29:91 6 3
30:91 6 2 1
31:91 5 4
32:91 5 3 1
33:91 4 3 2
34:90 10
35:90 9 1
36:90 8 2
37:90 7 3
38:90 7 2 1
39:90 6 4
40:90 6 3 1
41:90 5 4 1
42:90 5 3 2
43:90 4 3 2 1
44:89 11
45:89 10 1
... ...
444767:15 14 13 12 11 8 7 6 5 4 3 2
444768:15 14 13 12 10 9 8 7 6 5 1
444769:15 14 13 12 10 9 8 7 6 4 2
444770:15 14 13 12 10 9 8 7 6 3 2 1
444771:15 14 13 12 10 9 8 7 5 4 3
444772:15 14 13 12 10 9 8 7 5 4 2 1
444773:15 14 13 12 10 9 8 6 5 4 3 1
444774:15 14 13 12 10 9 7 6 5 4 3 2
444775:15 14 13 12 10 8 7 6 5 4 3 2 1
444776:15 14 13 11 10 9 8 7 6 5 2
444777:15 14 13 11 10 9 8 7 6 4 3
444778:15 14 13 11 10 9 8 7 6 4 2 1
444779:15 14 13 11 10 9 8 7 5 4 3 1
444780:15 14 13 11 10 9 8 6 5 4 3 2
444781:15 14 13 11 10 9 7 6 5 4 3 2 1
444782:15 14 12 11 10 9 8 7 6 5 3
444783:15 14 12 11 10 9 8 7 6 5 2 1
444784:15 14 12 11 10 9 8 7 6 4 3 1
444785:15 14 12 11 10 9 8 7 5 4 3 2
444786:15 14 12 11 10 9 8 6 5 4 3 2 1
444787:15 13 12 11 10 9 8 7 6 5 4
444788:15 13 12 11 10 9 8 7 6 5 3 1
444789:15 13 12 11 10 9 8 7 6 4 3 2
444790:15 13 12 11 10 9 8 7 5 4 3 2 1
444791:14 13 12 11 10 9 8 7 6 5 4 1
444792:14 13 12 11 10 9 8 7 6 5 3 2
444793:14 13 12 11 10 9 8 7 6 4 3 2 1
Total:444793
#15
思想使用递归思想,使用上可以使用内存存储递归结果
简单地说,15可以拆分成1+2+3+4+5这5个数,它可以分成首先确定第一个数5,然后把10拆分成1+2+3+4这4个数两步
原理就是这样,把100拆分成13个数,等于先从100中任意取出一个数,再将剩下的那个数拆分成12个数
代码参考8楼那段,具体能不能运行结果对不对就去问8楼吧
优化的话,因为要求所有数互不相同,因此使用n*(n+1)/2公式来判断,100至多拆分成13个数,因为要拆分成14个数,1+...+14=105大于100,诸如此类,自己优化吧
简单地说,15可以拆分成1+2+3+4+5这5个数,它可以分成首先确定第一个数5,然后把10拆分成1+2+3+4这4个数两步
原理就是这样,把100拆分成13个数,等于先从100中任意取出一个数,再将剩下的那个数拆分成12个数
代码参考8楼那段,具体能不能运行结果对不对就去问8楼吧
优化的话,因为要求所有数互不相同,因此使用n*(n+1)/2公式来判断,100至多拆分成13个数,因为要拆分成14个数,1+...+14=105大于100,诸如此类,自己优化吧
#16
7楼正解!(^_^)
#17
哈哈 也不谦虚下
#18
支持16楼!
#19
给力,正解,注意是任意个,不是任意两个
#20
#1
很简单的嘛 1+99 2+98 ...49+51。 49种
#2
这个应该不难啊........,其实就是首尾取数啊,1和99,2和98................伟大的高斯发明的啊.......
至于有多少.....我就不给你答案了....自己想
至于有多少.....我就不给你答案了....自己想
#3
大哥......我还在编辑帖子的...你怎么就抢先手了啊.........
#4
看不动题的就不要来捣乱了。。受不了了。。。234楼都是小学生智商么
#5
1. 100不算,因为它加上任何一个值都不会等于100,所以就剩下1到99这99个数字。
2. 由于必须满足两个数相加等于100,那么如果任意选定第一个数字后,那么第二个数字就确定了,即无需选择了。
3. 根据2,选择第一个数字的可能性有99个,选择第二个数字的可能性只有1个,因此取法有99种。
说实话,俺也不知道看懂题目了木有,如果说错了,就直接无视吧。
2. 由于必须满足两个数相加等于100,那么如果任意选定第一个数字后,那么第二个数字就确定了,即无需选择了。
3. 根据2,选择第一个数字的可能性有99个,选择第二个数字的可能性只有1个,因此取法有99种。
说实话,俺也不知道看懂题目了木有,如果说错了,就直接无视吧。
#6
没说必须是两个数吧???
#7
仅供参考
//求从Begin到End的正整数中挑出任意个数使其总和为Sum的所有方案
#include <stdio.h>
#include <conio.h>
int Begin,End,Sum;
int j;
int o[1000];
long n;
void combsum(int b,int e,int s,int d) {
int i;
if (e>s) e=s;
for (i=e;i>=b;i--) {
if ((i+b)*(i-b+1)/2<s) break;
o[d]=i;
if (s-i<=0) {
n++;
printf("%8ld:",n);
for (j=0;j<=d;j++) printf("%d ",o[j]);
printf("\n");
} else {
if (d+1<1000) combsum(b,i-1,s-i,d+1);
else {
printf("Error:Too deep.\n");
return;
}
}
}
}
void main() {
clrscr();
printf("Input Begin,End,Sum:");
scanf("%d,%d,%d",&Begin,&End,&Sum);
n=0L;
combsum(Begin,End,Sum,0);
printf("Total:%ld\n",n);
getch();
}
#8
#include<iostream>
#include<string>
using namespace std;
long long ans;
void dfs(int pos,int cnt,int sum,int size){
if(cnt==size){
if(100==sum)
ans++;
return ;
}
for(int i=pos+1;i<=100;++i){
if(i+sum<=100)
dfs(i,cnt+1,sum+i,size);
else
return ;
}
}
int main(){
for(int i=1;i<=100;++i) //枚举选取i个数字构成100
dfs(0,0,0,i);
printf("%I64d\n",ans);
system("pause");
return 0;
}
/*
444793
right?
*/
#9
#include<iostream>
#include<string>
using namespace std;
long long ans;
int select[100];
void dfs(int pos,int cnt,int sum,int size){
if(cnt==size){
if(100==sum){
ans++;
for(int i=0;i<cnt;++i)
printf("%d ",select[i]);
puts("");
system("pause");
}
return ;
}
for(int i=pos+1;i<=100;++i){
if(i+sum<=100){
select[cnt]=i;
dfs(i,cnt+1,sum+i,size);
}
else
return ;
}
}
int main(){
for(int i=1;i<=100;++i) //枚举选取i个数字构成100
dfs(0,0,0,i);
printf("%I64d\n",ans);
system("pause");
return 0;
}
/*
444793
right
*/
#10
你们没看明白啊 要是这么简单楼主就不会来这问了 任意选意思又不是只选两个
#11
楼上两位都是牛人啊
#12
貌似要用动态规划啊 好难啊
#13
你没说是多少个为一组。2个?3个?还是?
#14
1:100
2:99 1
3:98 2
4:97 3
5:97 2 1
6:96 4
7:96 3 1
8:95 5
9:95 4 1
10:95 3 2
11:94 6
12:94 5 1
13:94 4 2
14:94 3 2 1
15:93 7
16:93 6 1
17:93 5 2
18:93 4 3
19:93 4 2 1
20:92 8
21:92 7 1
22:92 6 2
23:92 5 3
24:92 5 2 1
25:92 4 3 1
26:91 9
27:91 8 1
28:91 7 2
29:91 6 3
30:91 6 2 1
31:91 5 4
32:91 5 3 1
33:91 4 3 2
34:90 10
35:90 9 1
36:90 8 2
37:90 7 3
38:90 7 2 1
39:90 6 4
40:90 6 3 1
41:90 5 4 1
42:90 5 3 2
43:90 4 3 2 1
44:89 11
45:89 10 1
... ...
444767:15 14 13 12 11 8 7 6 5 4 3 2
444768:15 14 13 12 10 9 8 7 6 5 1
444769:15 14 13 12 10 9 8 7 6 4 2
444770:15 14 13 12 10 9 8 7 6 3 2 1
444771:15 14 13 12 10 9 8 7 5 4 3
444772:15 14 13 12 10 9 8 7 5 4 2 1
444773:15 14 13 12 10 9 8 6 5 4 3 1
444774:15 14 13 12 10 9 7 6 5 4 3 2
444775:15 14 13 12 10 8 7 6 5 4 3 2 1
444776:15 14 13 11 10 9 8 7 6 5 2
444777:15 14 13 11 10 9 8 7 6 4 3
444778:15 14 13 11 10 9 8 7 6 4 2 1
444779:15 14 13 11 10 9 8 7 5 4 3 1
444780:15 14 13 11 10 9 8 6 5 4 3 2
444781:15 14 13 11 10 9 7 6 5 4 3 2 1
444782:15 14 12 11 10 9 8 7 6 5 3
444783:15 14 12 11 10 9 8 7 6 5 2 1
444784:15 14 12 11 10 9 8 7 6 4 3 1
444785:15 14 12 11 10 9 8 7 5 4 3 2
444786:15 14 12 11 10 9 8 6 5 4 3 2 1
444787:15 13 12 11 10 9 8 7 6 5 4
444788:15 13 12 11 10 9 8 7 6 5 3 1
444789:15 13 12 11 10 9 8 7 6 4 3 2
444790:15 13 12 11 10 9 8 7 5 4 3 2 1
444791:14 13 12 11 10 9 8 7 6 5 4 1
444792:14 13 12 11 10 9 8 7 6 5 3 2
444793:14 13 12 11 10 9 8 7 6 4 3 2 1
Total:444793
#15
思想使用递归思想,使用上可以使用内存存储递归结果
简单地说,15可以拆分成1+2+3+4+5这5个数,它可以分成首先确定第一个数5,然后把10拆分成1+2+3+4这4个数两步
原理就是这样,把100拆分成13个数,等于先从100中任意取出一个数,再将剩下的那个数拆分成12个数
代码参考8楼那段,具体能不能运行结果对不对就去问8楼吧
优化的话,因为要求所有数互不相同,因此使用n*(n+1)/2公式来判断,100至多拆分成13个数,因为要拆分成14个数,1+...+14=105大于100,诸如此类,自己优化吧
简单地说,15可以拆分成1+2+3+4+5这5个数,它可以分成首先确定第一个数5,然后把10拆分成1+2+3+4这4个数两步
原理就是这样,把100拆分成13个数,等于先从100中任意取出一个数,再将剩下的那个数拆分成12个数
代码参考8楼那段,具体能不能运行结果对不对就去问8楼吧
优化的话,因为要求所有数互不相同,因此使用n*(n+1)/2公式来判断,100至多拆分成13个数,因为要拆分成14个数,1+...+14=105大于100,诸如此类,自己优化吧
#16
7楼正解!(^_^)
#17
哈哈 也不谦虚下
#18
支持16楼!
#19
给力,正解,注意是任意个,不是任意两个