寫了幾道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 表示...