-
大小: 3KB文件類型: .rar金幣: 2下載: 0 次發布日期: 2021-05-27
- 語言: 其他
- 標簽:
資源簡介
子集和問題
Description
子集和問題的一個實例為〈S,t〉。其中,S={x1,x2,...,xn}是一個正整數的集合,c
是一個正整數。子集和問題判定是否存在S的一個子集S1,使得x∈S1,∑x=c.
試設計一個解子集和問題的回溯法。
?編程任務:
對于給定的正整數的集合S={x1,x2,...,xn}和正整數c,編程計算S 的一個子集
S1,使得x∈S1,∑x=c.
Input
由文件input.txt 提供輸入數據。文件第1 行有2 個正整數n 和c,n 表示S 的大小,c
是子集和的目標值。接下來的1 行中,有n 個正整數,表示集合S 中的元素。
Output
程序運行結束時,將子集和問題的解輸出到文件output.txt中。
當問題無解時,輸出“No Solution!”。
Sample Input
5 10
2 2 6 5 4
Sample Output
2 2 6

代碼片段和文件信息
#include?
#include?
using?namespace?std;
ifstream?cin(“1.in“);
ofstream?cout(“1.out“);
int?nccwrbestw;
vector??x;
vector??w;
vector??bestx;
bool?backtrack(int?i)
{
if?(i?>?n?-?1)
{
if?(cw?>?bestw)
{
for(int?j?=?0;?j? bestx[j]?=?x[j];
bestw?=?cw;
if?(bestw?==?c)?return?true;
else
return?false;
}
}
r?-=?w[i];
if?(cw?+?w[i]?<=?c)
{
x[i]?=?1;
cw?+=?w[i];
if?(backtrack(i+1))
return?true;
cw?-=?w[i];
}
if?(cw?+?r?>?bestw)
{
x[i]?=?0;
if?(backtrack(i+1))
return?true;
}
r?+=?w[i];
return?false;
}
int?main()
{
int?i;
cin?>>?n?>>?c;
x.resize(n);
w.resize(n);
bestx.resize(n);
cw?=?0;
bestw?=?0;
r?=?0;
for(i?=?0;?i? {
cin?>>?w[i];
r?+=?w[i];
x[i]?=?0;
bestx[i]?=?0;
}
if?(backtrack(0))
{
for(i?=?0;?i? if?(bestx[i]?==?1)
cout?< }
else
cout?<“No?Solution!“;
cout?< return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1039??2008-11-22?12:46??子集和問題\1076.cpp
?????文件??????24576??2009-03-13?19:17??子集和問題\子集和問題.doc
?????目錄??????????0??2009-03-13?19:17??子集和問題
-----------?---------??----------?-----??----
????????????????25615????????????????????3
評論
共有 條評論