子集和问题---来源于 计算机算法设计与分析(王晓东)

#include #include int len; // 输入长度.int sum; // 和.int *data; // 数据.char *output; // 所求子集元素,与输入数据对应,'Y'为取.// 获取输入.void GetInput(){ int i; printf("输入集合个数: "); scanf("%d", &len); while(len <= 0){ printf("集合个数必须大于0: "); scanf("%d", &len); } data = new int[len]; output = new char[len]; for(i = 0; i < len; i++){ printf("输入第%d个数: ", i+1); scanf("%d", &data[i]); output[i] = 'N'; } printf("输入子集和: "); scanf("%d", &sum); while(sum <= 0){ printf("子集和必须大于0: "); scanf("%d", &len); }}// 回朔求解:有解返回非0值,无解返回0.int GetRes(){ int p = 0; // 指向当前值. int temp = 0; // 当前子集合和. while(p >= 0){ if('N' == output[p]){ // 选中当前项. output[p] = 'Y'; temp += data[p]; if(temp == sum){ return 1; } else if(temp > sum){ output[p] = 'N'; temp -= data[p]; } p++; } if(p >= len){ // 开始回朔. while('Y' == output[p-1]){ p--; output[p] = 'N'; temp -= data[p]; if(p < 1){ return 0; } } while('N' == output[p-1]){ p--; if(p < 1){ return 0; } } output[p-1] = 'N'; temp -= data[p-1]; } } return 0;}// 打印结果.void PrintRes(){ int i; printf("\r\n所求子集为: "); for(i = 0; i < len; i++){ if('Y' == output[i]){ printf("%d ", data[i]); } }}void main(){ GetInput(); if(GetRes()){ PrintRes(); } else{ printf("无解!"); } printf("\r\nPress any key to continue."); getch();}子集和问题的一个实例为〈S,c〉。其中,S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得 ∑x=c, (其中x∈S1)。试设计一个解子集和问题的方法。你可以假设处理范围不超出int型。Input测试数据第1 行有2个正整数n和c,n 表示S 的大小(n<=25),c是子集和的目标值(0

你可能感兴趣的:(计算机算法设计与分析(王晓东))