问题描述中的数据题如何判断子集和问题是否存在S的一个子集S1,使得子集S1等于c?

子集和问题的一个实例为〈S,t〉,其中S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。... 子集和问题的一个实例为〈S,t〉,其中S={ x1, x2,…, xn}是一个正整数的集合,c是一个正整数。 展开
 我来答
乐观的L无谓
2018-03-11 · TA获得超过1.9万个赞
知道小有建树答主
回答量:84
采纳率:100%
帮助的人:9749
展开全部

给定n 个整数的集合X={x1,x2,...,xn}和一个正整数y,编写一个回溯算法,

在X中寻找子集Yi,使得Yi中元素之和等于y。

#include <stdio.h>#include <conio.h>

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();

}

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ahlaliuchao
2018-02-05
知道答主
回答量:32
采纳率:100%
帮助的人:14.9万
展开全部
给定n 个整数的集合X={x1,x2,...,xn}和一个正整数y,编写一个回溯算法,
在X中寻找子集Yi,使得Yi中元素之和等于y。
#include <stdio.h>#include <conio.h>
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();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式