在1到100这100个数字中,选出任意个互不相同的数字来,使得他们的和为100 问:有多少种取法?

时间:2022-11-05 15:45:08
在1到100这100个数字中,选出任意个互不相同的数字来,使得他们的和为100
问:有多少种取法?

19 个解决方案

#1


很简单的嘛 1+99 2+98 ...49+51。 49种

#2


这个应该不难啊........,其实就是首尾取数啊,1和99,2和98................伟大的高斯发明的啊.......
至于有多少.....我就不给你答案了....自己想

#3


引用 1 楼  的回复:
很简单的嘛 1+99 2+98 ...49+51。 49种

大哥......我还在编辑帖子的...你怎么就抢先手了啊.........

#4


看不动题的就不要来捣乱了。。受不了了。。。234楼都是小学生智商么

#5


1. 100不算,因为它加上任何一个值都不会等于100,所以就剩下1到99这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


引用 7 楼  的回复:
仅供参考

C/C++ code
//求从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……

       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,诸如此类,自己优化吧

#16


7楼正解!(^_^)

#17


引用 16 楼  的回复:
7楼正解!(^_^)

哈哈   也不谦虚下

#18


支持16楼!

#19


给力,正解,注意是任意个,不是任意两个
引用 7 楼  的回复:
仅供参考
C/C++ code
//求从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……

#1


很简单的嘛 1+99 2+98 ...49+51。 49种

#2


这个应该不难啊........,其实就是首尾取数啊,1和99,2和98................伟大的高斯发明的啊.......
至于有多少.....我就不给你答案了....自己想

#3


引用 1 楼  的回复:
很简单的嘛 1+99 2+98 ...49+51。 49种

大哥......我还在编辑帖子的...你怎么就抢先手了啊.........

#4


看不动题的就不要来捣乱了。。受不了了。。。234楼都是小学生智商么

#5


1. 100不算,因为它加上任何一个值都不会等于100,所以就剩下1到99这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


引用 7 楼  的回复:
仅供参考

C/C++ code
//求从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……

       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,诸如此类,自己优化吧

#16


7楼正解!(^_^)

#17


引用 16 楼  的回复:
7楼正解!(^_^)

哈哈   也不谦虚下

#18


支持16楼!

#19


给力,正解,注意是任意个,不是任意两个
引用 7 楼  的回复:
仅供参考
C/C++ code
//求从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……

#20