子集和问题的一个实例为〈S,t〉。其中,S={ x1, x2,…, xn}是一个正整数的集合,c是一个正整数。子集和
答案:5 悬赏:40 手机版
解决时间 2021-03-22 01:59
- 提问者网友:寂寞梧桐
- 2021-03-21 19:29
子集和问题的一个实例为〈S,t〉。其中,S={ x1, x2,…, xn}是一个正整数的集合,c是一个正整数。子集和
最佳答案
- 五星知识达人网友:你哪知我潦倒为你
- 2021-03-21 19:51
给定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;
在X中寻找子集Yi,使得Yi中元素之和等于y。
#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();
}
全部回答
- 1楼网友:舍身薄凉客
- 2021-03-22 00:25
集合是集合,整数是整数,两码事。
- 2楼网友:猎心人
- 2021-03-21 23:34
集合是集合,整数是整数,两码事。。。。。。
- 3楼网友:山君与见山
- 2021-03-21 21:54
对于给定的正整数的集合S={ x 1 , x2 ,…, xn }和正整数c,计算S 的一个子集S1,使得S1中元素和为c
- 4楼网友:十年萤火照君眠
- 2021-03-21 20:55
给定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();
}
在X中寻找子集Yi,使得Yi中元素之和等于y。
#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();
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯