乙個問題帶來的學習

2022-03-30 02:31:19 字數 2756 閱讀 5273

【故事】

從前,有乙個地主,他擁有很多座糧倉, 分別儲存了不同單位的糧食,分布在該城鎮的不同地點,短時間內也難以再操作。有一天,山大王殺到他家裡,要挾道:「我知道你有好幾座糧倉,現在我正在招兵買馬,糧草不足,您老救濟一下吧,交出幾座糧倉,保您老身體健康,發財大吉啊!要過這個冬天,弟兄們算了下需要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

_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;

}

(1)結果:

序列: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看到的是鐵柵欄外的風景。而很多時候我們都在懷疑自己。我們太快地去追...