抽签问题改进算法

来源:互联网 发布:js实现css3过渡效果 编辑:程序博客网 时间:2024/04/28 13:39
#if 0       你的朋友提议玩一个游戏,将写有数字的n个纸片放入口袋中,你可以从口袋中抽取4次纸片,每次记下纸片上的数字后都将其放回口袋中,如果这四个数字的和为m,   就是你赢,否则就是你的朋友赢,你挑战了好几次,结果一次也没有赢,于是撕破口袋,取出所有的纸片,检查自己是否有赢的可能性。       请编写一个程序,判断当纸片上写的数字是K1,K2,K3,...,Kn 时,是否村在抽取四次和为m的情况,如果存在,输出Yes,若不存在,输出No。#endif#include <stdio.h>#include <stdlib.h>int  Binary_search(int *Array ,int x,int n);int  Solve(int *Array ,int n,int sum,int *BArray);int  Partition_sort(int *Array,int low,int high);int  QuickSort(int *Array,int low,int high);void Initial_list(int *Array,int n,int *BArray);void Initial_list(int *Array,int n,int *BArray){     int k=0;     int i=0;     int j=0;     for(i=0;i<n;i++)        for(j=0;j<n;j++)        {          BArray[k]=Array[i]+Array[j];          k++;        }}int Partition_sort(int *BArray,int low,int high){    int location=*(BArray+low);    while(low<high && *(BArray + high)>=location)    {        high--;    }    if(low<high)    {        *(BArray+low)=*(BArray+high);    }    while(low<high && *(BArray + high)<=location)    {        low++;    }    if(low<high)    {        *(BArray+high)=*(BArray+low);        high--;    }    *(BArray+low)=location;    return low;}int QuickSort(int *BArray,int low,int high){    int base=0;    if(low<high)    {        base=Partition_sort(BArray,low,high);        QuickSort(BArray,low, base-1);        QuickSort(BArray,base+1,high);    }    return 0;}int Binary_search(int *BArray,int x,int n){     int mid=0;     int begin=0;     int end =n-1;     int found=0;     while(end-begin>=1)     {         mid=(begin + end )/2;         if(x==*(BArray+mid))            return found=1;         else if(x>*(BArray+mid))            begin=mid+1;         else            end=mid;     }     return found;}int Solve(int *Array ,int n,int sum,int *BArray){    int i=0,j=0;    int m=0;    int flag=0;    for(i=0;i<n;i++)        for(j=0;j<n;j++)            {                m=*(Array+i)+*(Array+j);                if(Binary_search(BArray,sum-m,n*n))                {                    flag=1;                    break;                }            }     return flag;}int main(){    int a[3]={1,3,5};    int n=3;    int sum=10;    int b[9];    Initial_list(a,n,b);    QuickSort(b,0,n*n-1);    if(1==Solve(a,n,sum,b))        printf("Yes");    else        printf("No");    return 0;}

0 0