c编程问题

2025-05-20 01:28:03
推荐回答(4个)
回答1:

就是背包问题的改编嘛:
你去建个数组,和你给的要求和的数一样大,如你要求50,就建个51的数组,第一个不存,其余依次存下1-50,下面为背包问题函数:
void bag(int i,int sum)
{
if(sum>key) return ; //如果和已大于要找的数,就没有必要在找了
if(sum==key) sign=1; //置标志位
if(i>n) return ;
used[i]=1; //uesd数组是用来存路径的,用来记载哪个元数用过
bag(i+1,sum+a[i]); //递归调用,即选择a[i]
used[i]=0;
bag(i+1,sum); //递归调用,不选a[i]
}
定义的used数组存放路径,和用来存放数据的a数组一样大,如过你要打印所有情况的话,将used数组在函数内定义,作为一个参数传替进来,再将if(sum==key) sign=1;这句的sign=1;该改为一个检测算法,即检测used数组是不是5个1(开始初始化为0) 如果是就打印出是1的元数就OK了.
现在没时间写完整算法,有时间加上...
如果还有不明白可以继续提问.

回答2:

#include
main()
{
int n;
printf("请输入一个和值:");
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int ii=i+1;ii for(int j=ii+1;j for(int jj=j+1;jj for(int ij=jj+1;ij {
if(i+ii+j+jj+ij==n)
printf("%d%s%d%s%d%s%d%s%d%s%d\n",n,"=",i,"+",ii,"+",j,"+",jj,"+",ij);
}

}

回答3:

排除相同数后产生的结果
#include
void main()
{
int number;
cout<<"enter the number:";
cin>>number;
for(int a=1;a<=20;a++)
{
for(int b=1;b<=20;b++)
{
for(int c=1;c<=20;c++)
{
for(int d=1;d<=20;d++)
{
for(int e=1;e<=20;e++)
{
if((a+b+c+d+e)==number&&a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e)
{
cout< }
}
}
}
}
}

}

回答4:

C语言学习群11660066