乙個集合x有都不相同的n個元素,使用這個集合中的不定個數的元素,組成乙個和為s的序列,求出所有符合的序列,元素可以重複使用,只要元素的個數相同不考慮順序。
比如集合是x=; n=5, s=12可以得出以下的序列:
2 2 2 2 2 2
2 2 2 3 3
3 3 3 3
2 2 2 2 4
2 3 3 4
2 2 4 4
4 4 4
2 2 3 5
3 4 5
2 5 5
2 3 7
5 7解題思路:
元素存在arr陣列中,大小為size。
path[i][j]表示陣列前i個元素(乙個元素可出現多次),組成重量恰好為j裝入揹包的可能,如可能則為true,否則為false。得到遞推關係:
path[i][j]=true,if path[i][j-arr[i]]=true的話;否則為false。
邊界條件path[i][0]=true(i為1...size),為了避免遍歷,在程式中使用
hashtable陣列,如果可以通過前面的元素組成容量為j的揹包,則hashtable[j]=true,否則為false。01
2345
6789
1011121
tftt
tftf
tftf
t2tf
ftft
tttt
ttt3
tfff
tftt
tttt
t4tf
ffft
fttt
ttt5
tfff
ffft
tttt
t求出path陣列後,通過printpath(int i,int j,int c)函式列印出所有的路徑。printpath(int i,int j,int c)是個遞迴函式,表示列印出所有第i個元素和前i-1個元素組成容量為j的揹包的路徑,函式遞迴過程中使用v佇列儲存過程中的元素,其中c為v佇列的大小。如printpath(2,12,0)將arr[2]=3加入佇列,然後呼叫printpath(2,9,1)將3入隊,然後分兩路,一路如藍字所示,呼叫printpath(1,6,2)將2入隊,...,佇列中元素為3,3,2,2,2,逆序列印;一路如淺紅色所示,呼叫printpath(2,6,2)將3入隊,...,佇列中元素3,3,3,3,逆序列印。呼叫遞迴函式請讀者仔細體會。
#include #include #include #include #include #define _debug 1
#define maxm 20
#define maxn 10
int arr[maxn];//數陣列
bool path[maxn][maxm+1];//路線
bool hashtable[maxm+1];//是否存在
int c;//記錄列印佇列大小
int v[maxm+1];//列印佇列,陣列大小最大為maxn+1,此時每個數為1
void printpath(int i,int j,int c)
printf("%d\n",v[0]);
return;
} assert(path[i][j]);
v[c++]=arr[i];//將元素加入到列印佇列中
for(int k=1;k<=i;k++)
c--;//將元素從列印佇列中刪除
}void solve(int size,int m)
} }for(i=1;i<=size;i++) }}
int main()
solve(n,m);
return 0;
}
乙個有趣的題目
看到qq群裡有人發了乙個很有意思的題目 如果 昨天是明天就好了,那麼今天就是周五了,請問句中的今天是週幾?晚上睡覺的時候又想起這個問題,發現這個問題還大有文章,其實問題的關鍵在於上面的綠色背景的如果兩個字,既然是如果,那麼思維就可以完全發散,如果時間可以穿越,明天真的可以穿越到昨天,那麼今天其實就是...
乙個c 題目
被人問了c 的乙個題目,簡直長知識哇 includeusing namespace std int i 1 class mycls void echo 這個 是建構函式,括號裡面是他們的初值,然後 初始化的順序是根據定義的次序也就是 private int m nfri int m nsec int...
乙個概率題目
1.題目 來自北郵論壇上的乙個題目。4個男人和一些女人一起被關在乙個屋子裡,然後又關進去一人,然後隨機的取出一人,發現取出來的人是男人,問最後關進去的那個人是男人的概率。假設男女比例很和諧,為1 1 tips 是一些女人,不是乙個女人,也就是女人的個數是未知的 2.思路 男女比例1 1這說明,p 放...