怎样用C语言编程一下这道题?

2025-03-13 13:45:31
推荐回答(2个)
回答1:

前面这段话,可能让你误解了,删掉

使用回溯法实现,计算量很大,最后结果 :共有 32174932 个子集满足和为280

去掉打印,可以提高速度

#include
void p(unsigned long count, int a[], int n)
{
int i;
printf("%10lu ", count);
for(i=0;iprintf("%2d ", a[i]);
printf("%3d\n", f(a,n));
}
int f(int a[], int n)
{
int i,k=0;
for(i=0;ik+=a[i];
return k;
}

void main()
{
unsigned long count=0L;
int a[33];
int i=0;
a[i]=33;
while(a[0]>23)
{
while(i<33 && a[i]>0 && f(a,i)<280)
{
a[i+1]=a[i]-1;
i++;
}
if(i<33 && a[i]>0)
{
count++;
p(count,a,i);
}
i-=2;
a[i]--;
while(a[i]==0)
{
i--;
a[i]--;
}
}
printf("count = %10ul\n", count);
getch();
}

回答2:

#include
#include

#define BNUM 500

/*计算从b开头 到 e结束的组合*/
void foo(int * b , int * e , int *c)
{
int * p , sum = 0;
for(p = b ; p <= e ; p++ )
if((sum += *p) > BNUM)
{
(*c)+=(e-p+1);
break;
}
}

int main(int argc, char* argv[])
{
int i , count = 0;
int test[34] = {0 , 1, 2, 3, 4, 5, 6, 7, 8, 9,
10,11,12,13,14,15,16,17,18,19,
20,21,22,23,24,25,26,27,28,29,
30,31,32,33};

for(i=0 ; i<34 ; i++)
foo(test + i , test + 33 , &count);

printf("%d" , count);

system("pause");

return 0;
}