子集
Time limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description
子集和问题的一个实例为〈S,t〉。其中,S={ x1 , x2 ,…,xn }是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得:
。
试设计一个解子集和问题的回溯法。
对于给定的正整数的集合S={ x1 , x2 ,…,xn }和正整数c,计算S 的一个子集S1,使得:
。
Input
输入数据的第1 行有2 个正整数n 和c(n≤10000,c≤10000000),n 表示S 的大小,c是子集和的目标值。接下来的1 行中,有n个正整数,表示集合S中的元素。
Output
将子集和问题的解输出。当问题无解时,输出“No Solution!”。
Sample Input
5 10
2 2 6 5 4
Sample Output
2 2 6
Hint
Source
#include <stdio.h>
#define MAX 10000
int data[MAX];
bool v[MAX];
int n, c;
bool traceback(int n)
{
int p = 0, sum = 0;
while (p >= 0)
{
if (!v[p])
{
v[p] = true;
sum += data[p];
if (c == sum)
return true;
else if (c < sum)
{
v[p] = false;
sum -= data[p];
}
p++;
}
if (p >= n)
{
while (v[p - 1])
{
p--;
v[p] = false;
if (p < 1)
return false;
}
while (!v[p - 1])
{
p--;
if (p < 1)
return false;
}
sum -= data[p - 1];
v[p - 1] = false;
}
}
return false;
}
int main()
{
scanf("%d %d", &n, &c);
for (int i = 0; i < n; i++)
scanf("%d", &data[i]);
if (traceback(n))
{
int first = 1;
for (int i = 0; i < n; i++)
if (v[i])
{
if (first)
first = 0;
else
printf(" ");
printf("%d", data[i]);
}
printf("\n");
}
else
printf("No Solution!\n");
return 0;
}
相关阅读
本文来自https://www.cnblogs.com/Mculover666/p/9126191.html 1、新建C#项目工程 首先选择新建Windows窗体应用(.NET Framewor
“996”工作制,即每天早 9 点到岗,一直工作到晚上 9 点。每周工作 6 天。 一、事件缘起 996.ICU是由程序员发起的,抵制 996 工作制的
declare-styleable是给自定义控件添加自定义属性用的1.首先,先写attrs.xml<?xml version="1.0" encoding="utf-8"?> <resources>
cpu散装和盒装有什么区别?装过机的朋友大致都知道,目前的CPU市场分为盒装和散装2种,并且在DIY市场都普遍存在。比如,在DIY电脑卖场装
使用git merge --squash,让commit变得优雅
阅读本文需要3分钟 情景模拟 我们有三个分支,master,develop以及feature特性分支,假定我们开发时使用的是feature分支,我们来这里查看