使用迭代器對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 ...