| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 556 人关注过本帖
标题:C语言程序中的相加反算功能
只看楼主 加入收藏
jycysn
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-9-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
C语言程序中的相加反算功能
各位大使:我已经知道589160 是由下面数值中的几个相加而成,如何可以算出589160是由哪个数相加,怎么写控制程序,谢谢各位。如有结果,欢迎大家无私的奉献出来,谢谢。
114190
71730
70750
46650
13650
116030
113670
111160
115878
60280
111305
114150
115684
77100
109930
59600
111620
113806
109305
100799
107405
115290
103335
114495
116265
41430
114337
106386
40500
28335
105150
112355
102785
109050
43058
102470
109010
111515
107547
20647

搜索更多相关主题的帖子: 相加 C语言 
2009-09-02 10:47
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:0 
应该是背包问题。你可以在网上找找看相关资料。
2009-09-02 10:57
jycysn
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-9-2
收藏
得分:0 
能具体点说说不。不是太懂
2009-09-02 11:03
jycysn
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-9-2
收藏
得分:0 
有没有大侠知道的啊,SOS!!!!
2009-09-02 13:27
jycysn
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-9-2
收藏
得分:0 
有没有大侠知道的啊,SOS!!!!
2009-09-02 14:23
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:20 
在给出的40个整数里加得589160的有143种。
程序代码:
void shuchu(int k[],long a[],long x)
 {
  int i,j;
  long n=0;

  for(i=0;i<10;i++)
    {
     n+=a[k[i]];
     if(n==x)break;
     else if(n>x)break;
    }
  if(n==x)
    {
     for(j=0;j<=i;j++)
      {
       printf("%ld",a[k[j]]);
       if(j!=i)printf("+");
      }
    }
 printf("=%ld\n",n);
}


main()
 {
  long int n,y,x=589160,b[40],a[40]={114190,71730,70750,46650,13650,116030,113670,111160,115878,60280,
         111305,11410,115684,77100,109930,59600,111620,113806,109305,100799,
         107405,115290,103335,114495,116265,41430,114337,106386,40500,28335,
                 105150,112355,102785,109050,43058,102470,109010,111515,107547,20647};
  int i,j,m,k1,k[10];
  for(i=0;i<40;i++)
    b[i]=a[i];
  for(i=0;i<39;i++)
   {
    n=a[i];
    k1=0;
    for(j=i+1;j<40;j++)
      {
       if(n>a[j])
     {
      k1=j;
      n=a[k1];
     }
      }
    if(k1!=0)
      {
       n=a[i];
       a[i]=a[k1];
       a[k1]=n;
      }
   }

  m=y=0;
  for(i=0;i<40;i++)
    {
     printf("%ld ",a[i]);
     if((i+1)%10==0)
      printf("\n");
    }
  printf("\n");
  for(k[0]=0;k[0]<39;k[0]++)
    {
     n=a[k[0]];
     for(k[1]=k[0]+1;k[1]<40;k[1]++)
       {
    if(n+a[k[1]]>x)break;
    else n+=a[k[1]];
    for(k[2]=k[1]+1;k[2]<40;k[2]++)
      {
       if(n+a[k[2]]>x)break;
       else n+=a[k[2]];
       for(k[3]=k[2]+1;k[3]<40;k[3]++)
         {
          if(n+a[k[3]]>x)break;
          else n+=a[k[3]];
          for(k[4]=k[3]+1;k[4]<40;k[4]++)
        {
         if(n+a[k[4]]>x)break;
         else n+=a[k[4]];
         for(k[5]=k[4]+1;k[5]<40;k[5]++)
           {
            if(n+a[k[5]]>x)break;
            else n+=a[k[5]];
            for(k[6]=k[5]+1;k[6]<40;k[6]++)
              {
               if(n+a[k[6]]>x)break;
               else n+=a[k[6]];
               for(k[7]=k[6]+1;k[7]<40;k[7]++)
             {
              if(n+a[k[7]]>x)break;
              else n+=a[k[7]];
              for(k[8]=k[7]+1;k[8]<40;k[8]++)
                {
                 if(n+a[k[8]]>x)break;
                 else n+=a[k[8]];
                 for(k[9]=k[8]+1;k[9]<40;k[9]++)
                   {
                n+=a[k[9]];
                if(n==x)
                  {
                   y++;
                   m=1;
                   shuchu(k,a,x);
                   n-=a[k[9]];
                   break;
                  }
                else n-=a[k[9]];
                   }
                 if(n==x&&m==0)
                {
                 y++;
                 m=1;
                 shuchu(k,a,x);
                 n-=a[k[8]];
                 break;
                }
                 else {m=0;n-=a[k[8]];}
                }
              if(n==x&&m==0)
                {
                 y++;
                 m=1;
                 shuchu(k,a,x);
                 n-=a[k[7]];
                 break;
                }
              else {m=0;n-=a[k[7]];}
             }
               if(n==x&&m==0)
             {
              y++;
              m=1;
              shuchu(k,a,x);
              n-=a[k[6]];
              break;
             }
               else {m=0;n-=a[k[6]];}
              }
            if(n==x&&m==0)
              {
               y++;
               m=1;
               shuchu(k,a,x);
               n-=a[k[5]];
               break;
              }
            else {m=0;n-=a[k[5]];}
           }
         if(n==x&&m==0)
           {
            y++;
            m=1;
            shuchu(k,a,x);
            n-=a[k[4]];
            break;
           }
         else {m=0;n-=a[k[4]];}
        }
          if(n==x&&m==0)
        {
         y++;
         m=1;
         shuchu(k,a,x);
         n-=a[k[3]];
         break;
        }
          else {m=0;n-=a[k[3]];}
         }
       if(n==x&&m==0)
         {
          y++;
          m=1;
          shuchu(k,a,x);
          n-=a[k[2]];
          break;
         }
       else {m=0;n-=a[k[2]];}
      }
    if(n==x&&m==0)
      {
       y++;
       m=1;
       shuchu(k,a,x);
       n-=a[k[1]];
       break;
      }
    else {m=0;break;}
       }
     m=0;
    }
  printf("\ny=%ld\n\n",y);
  for(i=0;i<40;i++)
    printf("%8ld",a[i]);
  printf("\n\n");
 }

努力—前进—变老—退休—入土
2009-09-02 19:52
jycysn
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2009-9-2
收藏
得分:0 
回复 6楼 UserYuH
谢谢你!
2009-09-07 09:30
机器能
Rank: 2
等 级:论坛游民
帖 子:46
专家分:61
注 册:2009-8-24
收藏
得分:0 
程序代码:
#include "stdio.h"
#define N 10
long A[10],sum=0,
a[39]={71730,70750,46650,13650,116030,113670,111160,
115878,60280,111305,114150,115684,77100,109930,59600,111620,113806,109305,
100799,107405,115290,103335,114495,116265,41430,114337,106386,40500,28335,
105150,112355,102785,109050,43058,102470,109010,111515,107547,20647},
tsum=589160;
int array(int n,int k,int flag)
{
    int i,j;
    if(k==n)
    {
        if(sum==tsum)
        {
            for(j=0;j<n;j++)printf("%d ",A[j]);putchar('\n');

            return 0;
        }
        return 0;
    }
    for(i=flag;i<(30-n);i++)
    {
        sum+=a[i];A[k]=a[i];
        array(n,k+1,i+1);
        sum=sum-a[i];A[k]=0;
    }
}
void main()
{
    int i,n;
    

    for(n=2;n<N;n++)
    {
        array(n,0,0);
    }

}
回溯法~

不管黑猫白猫抓住老鼠就是好猫~
2009-09-07 14:18
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
回复 9楼 机器能
好方法,程序简洁。学习!
但是,这算法才46种加等于589160,还有很多种没算出。

努力—前进—变老—退休—入土
2009-09-07 15:59
快速回复:C语言程序中的相加反算功能
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017254 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved