2月三號 集訓第三天

2021-06-28 13:53:50 字數 2794 閱讀 1087

主題:揹包

揹包是利用動態規劃 

主要形式:

1.一維形式

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

memset(dp,0,sizeof(dp));

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

for(int j = m; j >= w[i]; j--){

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

printf("%d", dp[m]);//從大到小保持不會爆

2.二維形式

函式實現  0-1 揹包

#include

#include

using namespace std;

int v[3500][15000];//在main函式外面能把一/二維陣列開的更大一些

int knapsack(int n, int m, int *w, int *v){

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

v[0][i] = 0;

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

v[i][0] = 0;

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

for(int j = 1; j <= m]; j--){

if(j < w[i]){

v[i][j] = v[i-1][j];

else {

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

int j = m; 

for(int i =n ;i > 0; i--){

if(v[i][j] > v[i][j-1]){

j = j - w[i];

else ;

return v[n][m];

int main(){

itn n, m,w[500],v[500];

memset(v,0,sizeof(v));

while(~scanf("%d%d", &n,&m)){

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

scanf("%d%d", &w[i], &v[i]);

printf("%d\n", ksnapsack(n,m,w,v));

return 0;

3.揹包不一定為+,還可變形為×

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

for(int j = m; j >= w[i] ; j--)

.... = max(    ,   )

只是為了得到最接近m的組合

4.二維陣列可以用下標來表示乙個平衡狀態

如果i下標會小於零的話,重新定義乙個零點.

例定義7500為零點.

dp[0][7500] = 1;//m表示砝碼的個數,n表示距離中心的距離的個數

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

for(int j = 1; j <= m; j++){

for(int k = 0; k <= 15000; k++){

dp[i][k + w[i]*v[j]]+=dp[i-1][k];

printf("%d", dp[m][7500]);

5.最長不下降子串行

一.n*2複雜度的一般做法(大於10000個元素時不再適用)

#include

int main(){

int num[100],a[100];

int n;

scanf("%d", &n)

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

scanf("%d", &a[i]);

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

num[i] = 1;

for(int j = 0; j < i; j++){

if(a[i] > a[j]&&num[j]+1>num[i]){

num[i] = num[j] +1;

int max = 0;

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

if(max < a[i])

max = a[i];

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

return 0;

二.二分法 複雜度n*logn

int a[10000],num[10000];

int find(int len ,int n){

int left = 1, right = len;

int mid;

whie(left<=right){

if(a[mid] = n) return mid;

else if(a[mid] > n)  right = mid - 1;

else if(a[mid] < n) left = mid + 1;

return left;

int main(){

int n;

while(~scanf("%d", &n)){

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

scanf("%d", a[i]);

num[1] = a[1];

int len = 1;

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

int j = find(len ,a[i]);

num[j] = a[i];

if(j > len)

len = j;

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

return 0;

集訓第三天,打卡

今天訓練賽自己價效比搞了個k題,相對較水,也算做了點貢獻吧。有一條概率dp,戴老闆秒切,膜啊,覺得不錯,所以寫了來。題意是乙個棋盤,在上面隨機放旗子,問所有的列和行上至少有乙個棋子的期望是多少。顯然的概率dp,dp i j k 表示放了i個棋子,覆蓋了j行,k列的概率。當前狀態都可以由放i 1個棋子...

第三天 11月2日

今天發過來乙個版本發布內容表,主要是本月重要的幾個版本的更新內容及更新時間 都在星期三例行維護時間 該錶主要是由測試與產品參與協商出來的。對於其他配置的小更新,會在其他時間例行維護時進行更新。對於代主程乙個主要任務就是 催 催資源,催產品需求,崔策劃案子等等,這就需要主程能夠明確所需的各種資源與需求...

XTU集訓第三天16 7 19

上午把訓練題專案管理給a了。原來vector還能這麼用啊 b 專案管理 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 我們建造了乙個大專案!這個專案有n個節點,用很多邊...