01揹包入門題 簡單到死

2021-08-08 20:47:46 字數 1895 閱讀 4522

題意:最裸的01揹包,給你揹包總量和物品數,以及物品的價值和體積,讓你求揹包裝滿後的最大價值

#include

using

namespace

std;

const

int n = 1e3 + 10;

int w[n],v[n],dp[n];

int main()

}cout

0;}

題意:給你n個菜的**,沒種菜只能買一次,再給你乙個m,表示你卡上的餘額,有個規定,就是可以用卡里最後的5元錢去購買所有菜裡面最貴的乙個菜,問你卡裡面最少還剩多少錢

分析:首先貪心的先用5元錢,去買最貴的那乙個菜,然後剩餘的錢做乙個01揹包即可,哦對了,如果一開始的錢就小於5元的話就直接輸出即可

#include

using

namespace

std;

const

int n = 1e3 + 10;

int dp[n],a[n];

int main()

}cout

<5]-a[n]0;}

題意:首先看到浮點型的就得注意精度問題了,先給你兩個數,乙個是最大的「容錯度」:p,就是如果這個人被警察抓住的概率大於這個值時就會被抓走,還有個時銀行的數目,接下來輸入的是每個銀行的錢數和各自銀行被抓到的概率

分析:因為這個浮點型的,不好直接求,也不能直接把那個所有的容錯度都擴大乙個倍數,這樣理解是不對的,因為得考慮乙個容斥,從正面分析有點複雜,不妨以反過來,以獲得的錢為重量,以被抓的概率為價值,只要不被抓的概率小於等於(1-p)即可,這裡面的概率運算可不是相加啦,而是相乘的,所以狀態轉移方程就是dp[j] = max,最後從最大的開始列舉,只要大於等於(1-p)就輸出即可

#include 

using

namespace

std;

#define eps 0.00000000001

struct nodea[5007];

double dp[5007];

int main()

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

}for(int i = sum_v;i >= 0;i--)}}

return

0;}

#include 

using

namespace

std;

const

int maxn = 10007;

int main()

for(int i = 0;i < m;i++)

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

}return

0;}

題意:給你n組資料,包括兩個值,乙個裝置的價值,和相應的數目,讓你分成兩份,盡可能的相等,最後輸出兩個數,保持前面那個數大於等於後面那個數

分析: 就是乙個看似01揹包的題,用另乙個陣列把所有值都包含,直接對sum/2 進行01揹包即可

#include

using

namespace

std;

const

int n = 1e5 + 10;

int dp[n];

vector

a;int main()

int sum1 = sum/2;

for(int i = 0;i < a.size();i++)

}printf("%d %d\n",max(dp[sum1],sum-dp[sum1]),min(dp[sum1],sum-dp[sum1]));

}return

0;}

待更新…………

完全揹包入門題 簡單到死啊

題意 乙個存錢罐,給你一開始體積和總共可以裝的體積,然後在給你n 個硬幣,給你相應的價值和體積,問你裝滿的話最少可以裝多少錢,硬幣可以用無限次 分析 乙個完全揹包的板子題,直接看 include using namespace std const int n 1e5 10,inf 0x3f3f3f3...

01揹包入門

01揹包問題模型 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方...

01揹包入門

description 乙個旅行者有乙個最多能裝m公斤的揹包,現有n件物品,它們的重量分別是w1,w2,w3,wn,它們的價值分別為c1,c2,c3,cn。若每種物品只有一件,求旅行者能獲得的最大總價值。input m,和n m 200,n 30 接下來共n行每行兩個整數wi,ci output 最...