01揹包幾題

2021-07-15 22:41:47 字數 2661 閱讀 4315

寫了幾道01揹包,感覺做的時候想了好久都做不出來,還是有點考察思維的。

題意是乙個人要去投簡歷給m個學校想拿個offer,每個學校都有自己的申請費ai,這個人 存了n元錢,給出每個學校的申請費和拿到offer的機率,求出至少拿到乙個offer的最大概率 揹包容量是n元

思路:按照概率來說求   p1(至少拿到乙個offer)=  1-p2(n元內拿到最多的offer)  

因為p1要最大所以p2要最小   dp【i】表示i元拿到最多offer的最小概率  dp=1因為不投簡歷是拿不到offer的

**如下:

#include#include#include#includeusing namespace std;

#define n 10010

int main()

for(i=0;i<=n;i++)

dp[i]=1.0;

for(i=1;i<=m;i++)

}printf("%.1lf%%\n",(1-dp[n])*100);

} return 0;

}

題意飯卡在低於5元時不能消費,但高於5元就能買任何**的菜。所以同學們在買菜的時候盡量把餘額控制在5塊錢以上去買最貴的菜。求出那個餘額,一開始的餘額是m。

思路就是題意那樣:揹包是反的,求出在買完一定的菜後餘額是最接近並大於5元的錢

先把**最大的菜找出來然後在計算的時候略過他    dp【i】表示買i個菜後的餘額

**如下:

#include#include#include#includeusing namespace std;

#define n 1010

int a[n],dp[n];

int main()

cout<

這是一道求01揹包的第k解    

題意:給出n個物品的重量和價值,在v個重量內求出第k大的價值

思路:dp【j】【k】表示第j重量裡的第k大的價值。   在操作裡面再加個關於k的for迴圈用兩個陣列代替dp陣列來存dp【j】【k】和dp【j-w【i】

】【k】+v【i】。

這樣做的目的是因為若用原始的公式則會存在重複的數值,可能一樣大的揹包不同的組法能組成一樣大的價值,這樣就不能判斷它是第幾大了,所以要用陣列記錄每個資料,每次進行比較把較大的數存入dp中。

**如下:

#include#include#include#include#includeusing namespace std;

#define n 11000

int a[n],b[n],dp[1010][50];

int c[n],d[n];

int main()

c[kk]=-1;

d[kk]=-1;

x=y=z=1;

while(z<=k&&(c[x]!=-1||d[y]!=-1))

}cout<

也是個概率的問題。題意是講乙個小偷去n個銀行偷錢,每個銀行有mi個現金,小偷的在每個銀行被抓的概率為pi,當偷完多個銀行後概率為p時就一定會被抓

思路是:dp【i】是偷完i的現金後逃跑成功的概率   揹包的容量是s=m(1+...+n)。揹包的dp操作算出每次逃跑的概率。 

然後開個迴圈從s開始減,如果dp【i】>1-p  那麼就直接輸出i元錢

**如下:

#include#include#include#includeusing namespace std;

#define n 110000

double a[n],p,dp[n];

double max(double x,double y)

int m[n];

int main()

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

}for(i=s;i>=0;i--) }}

return 0;

}

題意是講乙個人去乙個國家買東西有n個物品m元錢,老闆在你的錢少於qi時不會賣給你

列出每個物品的**pi,qi,價值vi,求出m元買得最大價值

對qi-pi進行排序,即求q與p差額從小往大排列,在以此求最大價值

**如下:

#include#include#include#includeusing namespace std;

#define n 5100

struct rnga[n];

int dp[n];

int cmp(rng x,rng y)

} cout<

題意是有n頭牛有si的幽默感和ti的聰明度 有正有負

要求選出n頭牛使得幽默感和聰明度總和最高   

思路:有正數和負數的01揹包 

當數是正數時的做法就是01揹包的操作,

負數則是反著操作,因為存在負數,所以要開乙個很大的陣列來存。

**如下:

#include#include#includeusing namespace std;

int dp[200010];

int v[500],w[500];

#define inf 1<<30

int main()

printf("%d\n",res);

} return 0;

}

揹包 01揹包

01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...

揹包專題 01揹包

暑假集訓開始了,按照隊裡的分配,我是弄dp的,嘛,於是我又一次的開始了從01揹包開始學習,昨天將杭電的幾道01揹包重新做了一遍,下面講講我自己對於01揹包的理解。首先01揹包題目的雛形是 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。...

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...