【故事】
從前,有乙個地主,他擁有很多座糧倉, 分別儲存了不同單位的糧食,分布在該城鎮的不同地點,短時間內也難以再操作。有一天,山大王殺到他家裡,要挾道:「我知道你有好幾座糧倉,現在我正在招兵買馬,糧草不足,您老救濟一下吧,交出幾座糧倉,保您老身體健康,發財大吉啊!要過這個冬天,弟兄們算了下需要30單位的糧食,我明天來取!」
山大王走了之後,地主召集了所有人想想辦法。大家集思廣益,紛紛給出建議,你一言我一句。「請官兵來」,「就說你只有兩座糧倉好了」,......
地主是個膽小的人,而且考慮了各種情況還是決定要給出這30單位的糧食。就叫眾人看看如何選擇糧倉,損失最少。最後的結果就是:把各個糧倉的糧食計算一下,選擇剛好滿足30單位的糧倉就可以了。眾人紛紛使出了自己靈活的大腦,快速的計算起來了。大家想了半天,也還沒拿出最終的方案。地主這個時候看到管家這悠閒的思索著,便問道:你有何良策?管家笑道:要滿足山大王30單位的糧食,也就是選擇幾座糧倉的糧食之和剛好滿足30,直接去計算不免有點乏力。不過可以從相反的角度來思考:我們的目的是要使得交出去的量最小。那麼從相反的角度來說,如果我們去找那些能夠讓自己留下來的糧食最多的糧倉,那麼剩下來的糧倉也就是要交給山大王的。(大讚建凡)
在最終選擇了糧倉之後啊,突然有人給地主送來一匹良駒,據說日行千里,背馱萬頃。地主大喜,命令去選擇好的糧去把多餘30的糧食給偷偷運回來。可是去哪一座糧倉就疑惑了,如果用良駒去跑所有選擇的糧倉檢視是否可以,時間上根本來不及。地主問管家:選擇的糧倉中是不是肯定有一座是大於這個多餘的糧食的。管家想了想,說道:我不敢跟你直接說這個結果,但是我可以這麼跟您說,假設這些選擇的糧倉中所有的糧食都小於多餘的,如此如此,結果根本不可能,所以肯定有乙個是大於多餘的量的,因此查一下各個糧倉的剩餘量,也就可以了。
【思考】
抽象出來兩個問題:
1. 有乙個序列x = 。對於x的任意子集x′ = ,求min(σx′) > y(y是乙個閾值)。也就是就乙個子串行,滿足兩個條件:
(1)子串行之和要大於y
(2)滿足條件(1)中和最小的子集
2. 對於上面求出來的子串行xk = ,設σxk = s, r = s - y。證明肯定存在乙個xi(xi∈xk)滿足:xi >= r。
你也先別看,思考一下有什麼好的辦法去解決這個問題,高手有什麼別的建議或者更好的辦法也希望能分享給小弟,多謝!^_^
【思路】
1. 問題1
整體的思路如下:
(1)想到揹包問題,但是有一點不一樣。揹包問題是剛好小於揹包的大小,而這題是大於。但是還是非常符合動態規劃的子問題重疊,但是一直沒轉換成動態規劃解題。
(2)分而治之。朋友的思路。
(3)第二天一早,朋友就給我**,說可以這樣:揹包問題是求給定大小下的最大價值問題,此題反過來思考就是乙個揹包問題,把序列和減去閾值,然後求滿足這個容量的揹包問題,最後沒有被選中的就是此題的結果!直接大讚啊!^_^
2. 問題2
想了一會,然後想到反證法,也就很快看到結果了。毫無疑慮的往下寫**了。
證明:設x1+x2+...+xn >= y,並且x1+x2+...+xn-xi < y(i=1,n), r = x1+x2+...+xn - y
假設不存在乙個xi 滿足xi >= r,即所有的xi(i=1,n), 都有xi > r
因為x1+x2+...+xn-xi < y
所以x1+x2+...+xn < y+xi < y+r
與x1+x2+...+xn = y+r矛盾
所以證明成立!
【結果】
邏輯沒有問題了,問題也就迎仍而解了!還是貼一段**(參考網上改動了一點內容)
typedef struct(1)結果:_taglygoods
lygoods;
int lymax(int a, int
b)int lyprintpack(int **c, lygoods *a, int nitem, int nsize, std::vector &vecret)
}cout
<< "
printpack:
"<
for (int j = 0; j < nitem; j++)
cout
<
delete ret;
return
true;}
int lypack(lygoods *a, int nitem, int nsize, std::vector &vecret)
int nmax = 0
;
for (int i = 0; i < nitem; i++)
for (int j = 0; j < nsize; j++)
mn[i][j] = 0
;
for (int i = 1; i <= nitem; i++)
else}}
lyprintpack(mn, a, nitem, nsize, vecret);
int nret =mn[nitem][nsize];
for (int i = 0; i1; i++)
return
nret;
}
序列:2, 11, 15, 20, 32, 閾值:31
得到的結果是:11, 20
(2)隨機結果:
【總結】
1. 很高興碰到乙個這樣的問題,而且靜下心來去解決
2. 交流是很重要的,比乙個人學習的收益要大很多^_^
3. 動態規劃還真是沒有搞懂!繼續學習!
css巢狀帶來的乙個問題
頁面html如下 contents 不幸的是,上述html 所在的頁面引入了乙個外部css檔案,其中對span做了如下樣式定義 這種一刀切的方式很不好 span 這就造成了html 無法正確反映在頁面上。因為第乙個span的樣式 雖然不受外部css檔案中樣式定義的影響,因為如果某些屬性在不同的樣式表...
乙個失敗案例帶來的啟示
據說通過這個0成本的推廣方法,他們1年賺了60萬。後來我也通過了同樣的方法,賣桂圓。但是直到前天,我接到那個要買桂圓肉的 時,心裡一陣陣的不舒服。有乙個故事,說的是2個囚犯被關在同乙個牢房,他們同時往外看,囚犯a看到的是鐵柵欄,囚犯b看到的是鐵柵欄外的風景。而很多時候我們都在懷疑自己。我們太快地去追...
乙個失敗案例帶來的啟示
據說通過這個0成本的推廣方法,他們1年賺了60萬。後來我也通過了同樣的方法,賣桂圓。但是直到前天,我接到那個要買桂圓肉的 時,心裡一陣陣的不舒服。有乙個故事,說的是2個囚犯被關在同乙個牢房,他們同時往外看,囚犯a看到的是鐵柵欄,囚犯b看到的是鐵柵欄外的風景。而很多時候我們都在懷疑自己。我們太快地去追...