永发信息网

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

答案:2  悬赏:40  手机版
解决时间 2021-02-18 23:20
问题描述中的数据题如何判断子集和问题是否存在S的一个子集S1,使得子集S1等于c?
最佳答案
给定n 个整数的集合X={x1,x2,...,xn}和一个正整数y,编写一个回溯算法,
在X中寻找子集Yi,使得Yi中元素之和等于y。
#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("
所求子集为: ");for(i = 0; i < len; i++){
if('Y' == output[i]){
printf("%d ", data[i]);
}
}
}
void main(){
GetInput();
if(GetRes()){
PrintRes();
}
else{
printf("无解!");
}

printf("
Press any key to continue.");getch();
}

全部回答
给定n 个整数的集合X={x1,x2,...,xn}和一个正整数y,编写一个回溯算法,
在X中寻找子集Yi,使得Yi中元素之和等于y。
#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();
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
天子岗在什么地方啊,我要过去处理事情
下列对于病毒的叙述中,正确的是A. 病毒是原
一喝酒就全身发红怎么办
注册美国公司大概需要多少费用?
芸苔素内脂用于辣椒效果好吗?
梦见门牙掉流了很多血,连着肉
金玉满堂饭店这个地址在什么地方,我要处理点
厦门翔安马巷哪里在招卖衣服的营业员
【中国的发展趋势】我国历史发展的趋势
使君从南来,五马立踟蹰。使君遣吏往,问是谁
有关工地跑业务的相关问题
有款和word很像的软件打开后界面是一只蝴蝶的
泰囧在全球赚了多少钱
cpug540是不是i3请回复好吗?谢谢
基金客户个性化服务不包括(  )。A.做好客
推荐资讯
从南京到丽江有飞机直飞吗?
完成取样后,施工单位取样人员应在试样或其包
wcdma是什么卡
合安高速到安庆光彩大市场 哪个路口下比较近
一个花坛原来长400米宽200米扩建后长增加40米
美国把电子装配工业迁到东南亚,原因是  ①
小丸子星动漫地址在什么地方,想过去办事
有没有人知道刺客信条2井下那关怎么过?门打
209T、209PK、209HS、206G、206KP、SW160、SW
天籁和阿特兹哪个更省油
艺林路/渌水道(路口)地址在哪,我要去那里办
进口沃尔沃xc60是电子助力的吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?