事情是這樣的,這幾天我都一直沒怎麼刷題(好頹。。),直到今天上午去機房扯淡的時候
小張同學跑來跟我說:我精衛填海a掉了!
我本來覺得這題很難很難很難,然後就給自己找各種
理由不做,可是看到小張同學精神這麼抖擻,那我也不能落後啦。
一開始覺得還蠻難的,但是經過我在語文課上仔細思考後,得出了動態轉移方程。
思路如下:
小張同學的一句話啟發了我:體力為x時最大的體積
然後我靈光一閃(其實是思考了一整節語文課。。)推出了動態轉移方程:f[i][j]=max(f[i-1][j],f[i-1][j-tili[i]]+tiji[i])
tili這個陣列存的當然是體力了,tiji存的是體積
然後i是第i個石頭,j是當前的體力
可是這個二維陣列看起來有點暈乎乎的,我們通過觀察可以發現max函式裡面的兩個的前面的那個都是i-1,
也就相當於一樣嘛,那他一直一樣我們還要他幹什麼,就直接寫一維陣列就好,這樣更簡便而且更好理解:f[j]=max(f[j],f[j-tili[i]]+tiji[i])
方程有了,**也就好寫了:
for(int i=0;i)}}我們既然存了這個最大的體力值,那我們就要用了,乙個for遍歷一邊把體積大於v而且使用最小的體力值算出來就好了。
可是當我寫的時候發現:我根本沒有存體力啊。
那怎麼辦?
俗話說的好,用struct準沒錯
struct lililif[既然我們把這個陣列改了,for巢狀當然也要改10010];//
定義struct陣列
(大家不要學習哈,這是我十分的**,寫**的時候一定要考慮周全,不然會像我一樣出事故
for(int i=0;i)可是眼尖心細的同學一定會發現我這裡面有許多錯誤,這也就是我為什麼只得了10分的原因else
if(f[j].ji==f[j-tili[i]].ji+tiji[i]) f[j].li=f[j-tili[i]].li+tili[i];//
如果是後面的那個大,我們就用他之前搬的體力+搬這塊石頭需要的體力
} }
}
那麼我們現在乙個乙個來改正:
1.if(f[j].ji==f[j].ji)(上面**的第6行)
這個判斷肯定是成立的,他自己一定等於他自己。
我們想讓他判斷的前乙個f[j].ji已經不是以前的f[j].ji了,所以我們需要乙個變數用來儲存前乙個數,再在判斷的時候用這個數就好了
2.if(q==0)(上面**第7行)
我在這個判斷裡面根本沒有讓q=1啊!
所以這個小旗子沒有用啊!我們在判斷裡面加一句:q=1就ok了
(好像也不是很多哈
for(int i=0;i)最後再來乙個for遍歷陣列取最小的體力值輸出就行啦}else
if(f[j].ji==f[j-tili[i]].ji+tiji[i]) f[j].li=f[j-tili[i]].li+tili[i];}}
}
for(int i=c;i>=0;i--)下面是完整**:}if(xq==1) printf("
%d\n
",c-minn);//
如果這個石頭可以將這個池子填滿
else printf("
impossible
");//
如果不行
#include#include**已經在上面解釋過了,上面就不加注釋了(就是懶!using
namespace
std;
int v,n,c,tili[10010],tiji[10010],minn=999999,xq=0
;struct
lililif[
10010
];int
main()
for(int i=0;i)
}else
if(f[j].ji==f[j-tili[i]].ji+tiji[i]) f[j].li=f[j-tili[i]].li+tili[i];}}
}for(int i=c;i>=0;i--)
}if(xq==1) printf("
%d\n
",c-minn);
else printf("
impossible");
return0;
}
當然我a掉這道題之後再去看我的**發現有很多囉囉嗦嗦的地方,比如說根本不用存前乙個,直接把後面的判斷移到前面來,後面加個else就好了,追求**簡潔的同學可以試試這樣做(你試試伐,我怕我這個想法是錯的
洛谷 P1510 精衛填海
一看就是典型的揹包題。裸的揹包題。然而唯一的坑點就是體積大於剩下的坑也可以補上。按理來講應該塞不下去呀 但是寫 確實只過了第乙個點。includeusing namespace std int v,n,c,ans 1 int volume 10001 energy 10001 體積 體力 int f...
洛谷P1510 精衛填海
版權說明 本題為改編題。問題描述 發鳩之山,其上多柘木。有鳥焉,其狀如烏,文首,白喙,赤足,名曰精衛,其名自詨。是炎帝之少女,名曰女娃。女娃遊於東海,溺而不返,故為精衛。常銜西山之木石,以堙於東海。山海經 精衛終於快把東海填平了!只剩下了最後的一小片區域了。同時,西山上的木石也已經不多了。精衛能把東...
P1510 精衛填海(揹包)
題目描述 版權說明 本題為改編題。問題描述 發鳩之山,其上多柘木。有鳥焉,其狀如烏,文首,白喙,赤足,名曰精衛,其名自詨。是炎帝之少女,名曰女娃。女娃遊於東海,溺而不返,故為精衛。常銜西山之木石,以堙於東海。山海經 精衛終於快把東海填平了!只剩下了最後的一小片區域了。同時,西山上的木石也已經不多了。...