问题描述
解决方案
哎哎哎我也是给自己醉了居然循环了两次。现在应该可以了。采纳啊亲 TAT
#include<stdio.h>
#include<math.h>
double arry[10];
double inpath[55];
void init(){
for(int i = 0; i < 100; i++)
inpath[i] = 0;
}
// 快速排序,升序排序
void quiksort(double a[],int low,int high)
{
int i = low;
int j = high;
double temp = a[i];
if( low < high)
{
while(i < j)
{
while((a[j] >= temp) && (i < j))
{
j--;
}
a[i] = a[j];
while((a[i] <= temp) && (i < j))
{
i++;
}
a[j]= a[i];
}
a[i] = temp;
quiksort(a,low,i-1);
quiksort(a,j+1,high);
}
else
{
return;
}
}
void getResult(double sum, int index, double currSum, double *inpath,
int step, int NumOfdata){
int j,k;
if(fabs(currSum - sum) < 1e-6){
for(j = 0; j < step - 1; j++){
printf("%lf", inpath[j]);
printf("+");
}
printf("%lf", inpath[j]);
printf("n");
return ;
}else if(sum - currSum > 1e-3){
for(k = index; k < NumOfdata; k++){
inpath[step] = arry[k];
getResult(sum, k, currSum + arry[k], inpath, step + 1, NumOfdata);
}
}
else return ;
}
int main(){
int i;
double Sum;
printf("输入的数据个数:");
int NumOfdata;
scanf("%d", &NumOfdata);
printf("输入数据:");
for(i = 0; i < NumOfdata; i++)
scanf("%lf", &arry[i]);
quiksort(arry, 0, NumOfdata - 1);
printf("输入期望的和:");
scanf("%lf", &Sum);
init();
getResult(Sum, 0, 0, inpath, 0, NumOfdata);
return 0;
}
解决方案二:
最小数字是0.5
6=12_*0.5
也就是说所有数最多放12份
然后就是排列组合的
穷举法进行验证
解决方案三:
如果数据不大的情况下
可以先把输入的数据a[]先排个序,然后用队列,每一次加上a[i],如果加上的值小于所期望的值,则把它push回队列,超过了则抛弃,循环直到队列为空
解决方案四:
#include<stdio.h>
#include<math.h>
double arry[10];
double inpath[55];
void init(){
for(int i = 0; i < 100; i++)
inpath[i] = 0;
}
// 快速排序,升序排序
void quiksort(double a[],int low,int high)
{
int i = low;
int j = high;
double temp = a[i];
if( low < high)
{
while(i < j)
{
while((a[j] >= temp) && (i < j))
{
j--;
}
a[i] = a[j];
while((a[i] <= temp) && (i < j))
{
i++;
}
a[j]= a[i];
}
a[i] = temp;
quiksort(a,low,i-1);
quiksort(a,j+1,high);
}
else
{
return;
}
}
void getResult(double sum, int index, double currSum, double *inpath,
int step, int NumOfdata, double lastValue){
int j,k;
if(fabs(currSum - sum) < 1e-6){
for(j = 0; j < step - 1; j++){
printf("%lf", inpath[j]);
printf("+");
}
printf("%lf", inpath[j]);
printf("n");
return ;
}else if(sum - currSum > 1e-3){
for(k = index; k < NumOfdata; k++){
if(arry[k] >= lastValue) {
inpath[step] = arry[k];
getResult(sum, index, currSum + arry[k], inpath, step + 1, NumOfdata, arry[k]);
}
else continue;
}
}
else return ;
}
int main(){
int i;
double Sum;
printf("输入的数据个数:");
int NumOfdata;
scanf("%d", &NumOfdata);
printf("输入数据:");
for(i = 0; i < NumOfdata; i++)
scanf("%lf", &arry[i]);
quiksort(arry, 0, NumOfdata - 1);
printf("输入期望的和:");
scanf("%lf", &Sum);
for(i = 0; i < NumOfdata; i++){
init();
getResult(Sum, i, 0, inpath, 0, NumOfdata, 0);
}
return 0;
}
解决方案五:
思路:
比如有数据:A、B、C、D、E、F、G、H、、、、
用循环比较:(1)把A拿出来和B相加,如果等于6,就记录下这两个数,不等于6,就和C相加;后面依次。
第一轮循环完成后 (2)第二轮循环,就把B拿出来,和C相加,如果等于6,就记录下这两个数,后面依次。
。。。。。。。。。
解决方案七:
程序是好的,可能编译器的问题?我用的是Cfree。
时间: 2024-10-03 02:35:09