poj 1837 Balance 動態規劃

2022-08-09 07:48:10 字數 2190 閱讀 3686

使用迭代器對stl容器進行遍歷的方法:

for(set::iterator it = check.begin(); it != check.end(); it++)

//...*it

本題

a存掛鉤位置

b存物品質量

把掛在天平左邊的物品的質量視為負數 反之為正數

總質量的極限為20件重25的物品都掛在15的天平掛鉤處 即7500

dp[i][j]表示前i件物品總質量為(j-10000)時的掛法總數【陣列下標不能為負 所以整體往右移10000】

前i件的狀態至於前i-1件有關 所以用滾動陣列來作dp

裸的dp思想如下:

memset(dp, 0, sizeof(dp));//初始化

dp[0][10000] = 0;//初始條件

for i = 0...g

for k = 0...20000

if dp[cur][k] != 0 //保證下面的for迴圈中 dp陣列的第二維的下標不為負數

for j = 0...c

dp[i][k + b[i]*a[j]] += dp[i-1][k];//把重b[i]的物品放a[j]處後 用原狀態dp[i-1][k]的值來不斷更新現狀態

以上過程稍加改動即變為滾動陣列實現

複雜度:20 * 30 * 20000  約10^7

不同於許多別人的部落格

個人認為這只是一道「類01揹包」的問題 而不像別人所說的「就是01揹包」

之前對揹包問題的理解有誤

看了揹包九講的目錄之後才發現

「每種物品最多只能放一次」就可以往01揹包想了

個人覺得

揹包問題不僅旨在解決求最大價值的問題

它更廣泛的意義在於 為關於「選物品」之類的問題提供了一種合適的操作模式

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 25

;const

int maxm = 20000

;int dp[2

][maxm];

inta[maxn];

intb[maxn];

intmain()}}

cur = cur ^ 1

; }

printf(

"%d\n

", dp[cur][10000

]); }

return0;

}

最後我想吐槽乙個事

stl要慎用

本來想著在列舉20000個總質量的時候用set記錄出現過的總質量 來做個優化

沒想到時間反而變成原來的50倍!

感覺stl在寫大模擬的時候好用

然後像這種題還是少用吧

上面的**16ms 下面的**750ms

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 25

;const

int maxm = 20000

;int dp[2

][maxm];

inta[maxn];

intb[maxn];

set check[2

];int

main()

}check[cur].clear();

cur = cur ^ 1

; }

printf(

"%d\n

", dp[cur][10000

]); }

return0;

}

個人訓練 (POJ1837)Balance

這幾天抓住國慶的 時間 因為沒有女朋友,天天刷題emmmm 其實還在肝少前還要撈秋刀魚 重點攻克掉幾個基本的地方 搜尋 dp 圖論。這幾天的題目應該就是這些範圍。原題的意思大概是這樣的,有個天平,上面一堆掛鉤,然後一堆砝碼,砝碼掛在掛鉤上面,問平衡的情況有幾種。顯然不能窮舉,因為o 2020 的複雜...

動態規劃 POJ 1837 Balance

這段時間要沉迷刷題一段時間了,就讓csdn陪我一起吧!題目的大致意思是說,有乙個天平,題目給出天平上具有的鉤子數量為c,擁有的物品數量為g,現在要求你要利用這些重物,讓天平平衡,當然要求是要把全部的重物都掛到鉤子上,允許有鉤子空著。結果是要求輸出可以是天平達到平衡的懸掛方法種數。這種問題一看就是動態...

POJ 1837 Balance(01揹包變型)

題意 有乙個槓桿,上面有c個鉤子,有g件物品,全部放上去,問有多少種方式使天平平衡。思路 1.dp i j 代表第 i 件物品放到桿子上面之後,平衡度為 j 的方法數 2.如果不加處理,j 可能會是負數,所以要加上乙個 7500 的偏移,最後輸出的結果也是 dp n 7500 3.dp i v w ...