NOIP專題複習(一) 基礎的揹包問題

2021-08-09 11:28:38 字數 1646 閱讀 9006

之所以要走這麼乙個專題原因也很簡單,在下的基礎實在是太薄弱了…

所以接下來可能會變成非常基礎的題、略有難度的題和模板題並存的東西..

於是就是這樣,就先從揹包開始吧(

dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])

滾動陣列優化版:dp[i]=max(dp[i],dp[i-w[i]]+v[i])

而對於完全揹包,dp[i]=max(dp[i],dp[i-w[i]]+v[i])

兩者的區別就是列舉順序。

多重揹包可以拆開變成0-1揹包求解,但是一般採用二進位制優化。

將2^n個物品看為一組,然後再進行0-1揹包。

luogup1060 稍微將價值變形一下

#include 

using

namespace

std;

#define maxn 27

int v[maxn],w[maxn];

int dp[30007];

int n,m;

int main()

}cout

0;}

luogup1164 揹包計數

dp[j]+=dp[j-w[i]]

#include 

#include

using

namespace

std;

#define maxn 10003

int n,m;

int v[maxn],dp[maxn];

int main()

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

return

0;}

luogup1049 v[i]本身既是價值又是重量

#include 

using

namespace

std;

#define maxn 20005

int dp[maxn],w[32],n,m;

int main()

}printf("%d\n",m-dp[m]);

return

0;}

luogup1616 完全揹包裸題

#include 

#include

#include

using

namespace

std;

#define maxn 100003

#define maxm 10003

int dp[maxn],v[maxn],w[maxn],t,m;

int main()

}cout

#include

#include

#include

using

namespace

std;

#define maxn 32005

int v[64][3],w[64][3];

int v,m;

int dp[maxn];

int main()

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

}cout

0;}

於是都是水題…不過先熟練基礎吧

DP基礎 01揹包 複習

時間限制 1 sec 記憶體限制 128 mb 乙個旅行者有乙個最多能用m公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別為 c1,c2,cn。若每種物品只有一件,求旅行者能獲得最大總價值。第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2.n 1...

dp專題 簡單基礎dp 揹包

按照這個做的 hdu 1864 最大報銷額 01揹包 方法一 double型別的揹包 總數30個 每個最大1000 保留2位有效位。直接把double 100轉換為int型的揹包 看清題目 double型的01揹包 include include include using namespace st...

DP複習 有依賴的揹包問題

這類問題是01揹包的變形。所有的物品分為兩類,一類是主件,另一類是附件,每乙個附件都有它的主件,選取它的主件之後才能選取附件。問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只...