基礎練習 揹包DP 洛谷1164 小A點菜題解

2021-07-04 10:36:18 字數 1193 閱讀 8954

洛谷的題目又有那令人···的悲劇格式= =

uim神犇拿到了uoi的ra(鐳牌)後,立刻拉著**小a到了一家……餐館,很低端的那種。 uim指著牆上的價目表(太低階了沒有選單),說:「隨便點」。不過uim由於買了一些輔(e)輔(ro)書,口袋裡只剩m元(m<=10000)。

餐館雖低端,但是菜品種類不少,有n種(n<=100),第i種賣ai元(ai<=1000)。由於是很低端的餐館,所以每種菜只有乙份。

小a奉行「不把錢吃光不罷休」,所以他點單一定剛好吧uim身上所有錢花完。他想知道有多少種點菜方法。

由於小a肚子太餓,所以最多只能等待1秒。輸入格式:

第一行是兩個數字,表示n和m。

第二行起n個正數ai(可以有相同的數字,每個數字均在1000以內)。

輸出格式:

乙個正整數,表示點菜方案數。

輸入樣例#1:

4 4

1 1 2 2

輸出樣例#1:

3
無所謂了= =直接粘上吧

題目非常簡單,幾乎揹包入門題,其實嚴格來講並不是揹包,但是選不選的原理是一樣的

引用題解中的解釋,二維方程f[i,j]:=f[i-1,j]+f[i-1,j-a[i]];

陣列表示在前i道菜中,總**為j。

你可以不點這道菜(f[i-1,j]),或者點(f[i-1,j-a[i]])

壓縮空間到一維,就是

f[0]:=1;  

for i:=1 to n do

for j:=m downto a[i] do

f[j]:=f[j]+f[j-a[i]];

那麼直接上**

//洛谷1164 小a點菜 揹包dp

#include

#include

#include

using namespace std;

int n,m,a[100+10];

int f[10000+10];

int main()

f[0]=1;

for (int i=1;i<=n;i++)

for (int j=m;j>=a[i];j--)

printf("%d\n",f[m]);

return 0;

}

——佇倚危樓風細細,望極春愁,黯黯生天際

洛谷OJ P1164 小A點菜 01揹包問題

我最薄弱的方面就是dp了,之前一直很害怕dp,從今天開始就攻一攻dp吧,先把以前做的複習一遍 分析 1.如果當前的餘額i恰好能夠點這道菜,那麼金額為i時的點菜方式增加1 2.如果當前的餘額i點完這道菜還有剩餘,那麼金額為i時的點菜方式增加不點這道菜時的方式 所以得到遞推式dp j 1.dp j 1 ...

洛谷 1164 小A點菜(動態規劃的揹包問題)

題目背景 uim神犇拿到了uoi的ra 鐳牌 後,立刻拉著 小a到了一家 餐館,很低端的那種。uim指著牆上的價目表 太低階了沒有選單 說 隨便點 題目描述 不過uim由於買了一些輔 e 輔 ro 書,口袋裡只剩m元 m 10000 餐館雖低端,但是菜品種類不少,有n種 n 100 第i種賣ai元 ...

洛谷1164 小A點菜

uim神犇拿到了uoi的ra 鐳牌 後,立刻拉著 小a到了一家 餐館,很低端的那種。uim指著牆上的價目表 太低階了沒有選單 說 隨便點 不過uim由於買了一些輔 e 輔 ro 書,口袋裡只剩m元 m 10000 餐館雖低端,但是菜品種類不少,有n種 n 100 第i種賣a i元 a i 1000 ...