永发信息网

子集和问题的一个实例为〈S,t〉。其中,S={ x1, x2,…, xn}是一个正整数的集合,c是一个正整数。子集和

答案:5  悬赏:40  手机版
解决时间 2021-03-22 01:59
子集和问题的一个实例为〈S,t〉。其中,S={ x1, x2,…, xn}是一个正整数的集合,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();
}

全部回答
集合是集合,整数是整数,两码事。
集合是集合,整数是整数,两码事。。。。。。
对于给定的正整数的集合S={ x 1 , x2 ,…, xn }和正整数c,计算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("\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();
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
别克昂科威空调滤芯需要更换吗?
微信励志签名经典语句,励志的微信签名配配图
减脂可以一天跑步8速40分钟,一天骑动感单车
已知多项式4x2-(y-z)2的一个因式为2x-y+z,
大家觉得奔腾80怎么样啊?
洋火冲地址有知道的么?有点事想过去
我新买的NIKE运动水壶壶底有循环标识"7"和
我和一个朋友打奥杜尔老一,请问应该怎么打,
下图所示的实验基本操作正确的是A.倒用试剂瓶
尼康D5200套机(18-55mm)配多大的uv镜?
山东超越培训学校在什么地方啊,我要过去处理
填表说明南北方的差异,造成这种差异的主要因
求电影 同心难改 百度云,谢谢!
雨非雨,意思是什么
从哈尔滨火车站到中央大街金安怎么走
推荐资讯
csol刷称号杀戮机器,大灾变难度设定成入门可
GS8的发动机是什么材质
六婆串串香小龙店在哪里啊,我有事要去这个地
意思是什么意思,赵晓苏的艺术评价
请问兼职的配音员应如何计算工资呢?是按时计
有什么字是五行属火的但是带水字旁或三点水两
红楼梦主要讲了一件神马事?
如果m是一个正整数,且它的3倍加10不小于它的
已婚但是户口还没移在一起计划生育证明怎么开
若上一年度有亏损1万,第一季度弥补去年有亏
学健身教练对身高体重有要求吗
还原反应和皂化反应都能发生的是A.植物油B.油
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?