I NEED AN OFFER 01揹包問題

2021-08-15 17:04:30 字數 1163 閱讀 9443

speakless很早就想出國,現在他已經考完了所有需要的考試,準備了所有要準備的材料,於是,便需要去申請學校了。要申請國外的任何大學,你都要交納一定的申請費用,這可是很驚人的。speakless沒有多少錢,總共只攢了n萬美元。他將在m個學校中選擇若干的(當然要在他的經濟承受範圍內)。每個學校都有不同的申請費用a(萬美元),並且speakless估計了他得到這個學校offer的可能性b。不同學校之間是否得到offer不會互相影響。「i need a offer」,他大叫一聲。幫幫這個可憐的人吧,幫助他計算一下,他可以收到至少乙份offer的最大概率。(如果speakless選擇了多個學校,得到任意乙個學校的offer都可以)。 

input輸入有若干組資料,每組資料的第一行有兩個正整數n,m(0<=n<=10000,0<=m<=10000) 

後面的m行,每行都有兩個資料ai(整型),bi(實型)分別表示第i個學校的申請費用和可能拿到offer的概率。 

輸入的最後有兩個0。 

output每組資料都對應乙個輸出,表示speakless可能得到至少乙份offer的最大概率。用百分數表示,精確到小數點後一位。 

sample input

10 3

4 0.1

4 0.2

5 0.3

0 0

sample output
44.0%

hint
you should use printf("%%") to print a '%'.

分析:若是按照普通的01揹包:dp[i][j]=max(dp[i][j],dp[i][j-a[i]*b[i])表示拿到所有offer的最大概率

dp[i][j]=min(dp[i][j],dp[i][j-a[i]]*(1-b[i]))表示拿不到所有offer的最小概率,既為題中拿到至少1個offer的最大概率

注意開始時dp[i]要全部設為1。

#include#include#include#includeusing namespace std;  

double b[10005];  

int a[10005];  

double dp[10005];  

int main()  

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

}  }

揹包 01揹包

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

又見01揹包(01揹包題目3)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 有n個重量和價值分別為wi 和 vi 的 物品,從這些物品中選擇總重量不超過 w 的物品,求所有挑選方案中物品價值總和的最大值。1 n 100 1 wi 10 7 1 vi 100 1 w 10 9 輸入多組測試資料。每組測試資...

揹包專題 01揹包

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