| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5237 人关注过本帖
标题:回溯法求解子集和数问题
取消只看楼主 加入收藏
sunjinlong
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-11-19
结帖率:100%
收藏
 问题点数:0 回复次数:1 
回溯法求解子集和数问题
    给定一个n个整数的集合X={x1,x2....xn}和整数y,找出和等于y的X的子集Y.比如:若X={10,20,30,40,50,60}和y=60,则有三种不同长度的解,它们分别是{10,20,30},{20,40},{60}.这个问题可以用另一种方法明确表达,使得解是一种明显的长度为n的布尔向量,于是上面的三个解可以用布尔向量表示为:
{1,1,1,0,0,0},{0,1,0,1,0,0},{0,0,0,0,0,1}。
    今天试图用c语言实现该算法,但是总也调不出来。请大虾帮忙!我的程序代码如下:


#include <stdio.h>

int isLegal(int a[],int c[],int n,int y){
     int i;
     int sum=0;
     for(i=0;i<n;i++){
          if(c[i]==1){
                sum=sum+a[i];
          }
     }

     if(sum==y){
        return 1;
     }else{
        return 0;
     }
}

int isPart(int a[],int c[],int n,int y){
     int i;
     int sum=0;
     for(i=0;i<n;i++){
          if(c[i]==1){
                sum=sum+a[i];
          }
     }

     if(sum<y){
        return 1;
     }else{
        return 0;
     }
}

int partition(int A[],int c[],int n,int y){
    int k,j;
    int flag=0;
    for(k=0;k<n;k++){
        c[k]=-1;
    }

    k=0;
    while(k>=0){
        while(c[k]<=0){
            c[k]=c[k]+1;
            if(isLegal(A,c,n,y)){
                flag=1;
                /*储存或输出解向量*/
                printf("\n");
                for(j=0;j<n;j++){
                    printf("%d  ",c[j]);
                }
                break;

            }
            else if(isPart(A,c,n,y)){
                k=k+1;
                printf("aaaaa\n");
            }
        }

        c[k]=-1;
        k=k-1;
    }
    return flag;
}

void main(){
    int A[6]={10,20,30,40,50,60};
    int flag=0;
    int c[6]={-1,-1,-1,-1,-1,-1};
    flag=partition(A,c,6,60);
    if(flag){
        printf("find the answer!");
    }
    else{
        printf("can not find the answer!");
    }

    getch();
}
搜索更多相关主题的帖子: 回溯 子集 求解 
2010-03-22 22:01
sunjinlong
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-11-19
收藏
得分:0 
自己写的程序,谢谢你的帮忙
#include <stdio.h>
/*回溯法求解子集和数问题*/
int isLegal(int a[],int c[],int n,int y,int k){
     int i;
     int sum=0;
     for(i=0;i<n;i++){
          if(c[i]==1){
                sum=sum+a[i];
          }
     }

     if((sum==y)&&(k<=n-1)){
        return 1;
     }else{
        return 0;
     }
}

int isPart(int a[],int c[],int n,int y,int k){
     int i;
     int sum=0;
     for(i=0;i<n;i++){
          if(c[i]==1){
                sum=sum+a[i];
          }
     }

     if((sum<y)&&(k<n-1)){
        return 1;
     }else{
        return 0;
     }
}

int partition(int A[],int c[],int n,int y){
    /*回溯迭代算法*/
    int k,j;
    int flag=0;
    for(k=0;k<n;k++){
        c[k]=-1;
    }

    k=0;
    while(k>=0){
        while(c[k]<=0){
            c[k]=c[k]+1;
            if(isLegal(A,c,n,y,k)){
                flag=1;
                /*储存或输出解向量*/
                printf("\n");
                for(j=0;j<n;j++){
                    if(c[j]<0){c[j]++;}
                    printf("%d  ",c[j]);

                }


            }
            else if(isPart(A,c,n,y,k)){
                k=k+1;

            }
        }

        c[k]=-1;
        k=k-1;
    }
    return flag;
}

void main(){
    int A[6]={10,20,30,40,50,60};
    int flag=0;
    int c[6]={-1,-1,-1,-1,-1,-1};
    flag=partition(A,c,6,60);
    if(flag){
        printf("find the answer!");
    }
    else{
        printf("can not find the answer!");
    }

    getch();
}
2010-04-04 19:13
快速回复:回溯法求解子集和数问题
数据加载中...
 
   



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

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