P1510 精衛填海

2022-08-13 13:00:21 字數 2458 閱讀 2794

事情是這樣的,這幾天我都一直沒怎麼刷題(好頹。。),直到今天上午去機房扯淡的時候

小張同學跑來跟我說:我精衛填海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[

10010];//

定義struct陣列

既然我們把這個陣列改了,for巢狀當然也要改

(大家不要學習哈,這是我十分的**,寫**的時候一定要考慮周全,不然會像我一樣出事故

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];//

如果是後面的那個大,我們就用他之前搬的體力+搬這塊石頭需要的體力

} }

}

可是眼尖心細的同學一定會發現我這裡面有許多錯誤,這也就是我為什麼只得了10分的原因

那麼我們現在乙個乙個來改正:

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)

}else

if(f[j].ji==f[j-tili[i]].ji+tiji[i]) f[j].li=f[j-tili[i]].li+tili[i];}}

}

最後再來乙個for遍歷陣列取最小的體力值輸出就行啦

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 精衛填海(揹包)

題目描述 版權說明 本題為改編題。問題描述 發鳩之山,其上多柘木。有鳥焉,其狀如烏,文首,白喙,赤足,名曰精衛,其名自詨。是炎帝之少女,名曰女娃。女娃遊於東海,溺而不返,故為精衛。常銜西山之木石,以堙於東海。山海經 精衛終於快把東海填平了!只剩下了最後的一小片區域了。同時,西山上的木石也已經不多了。...