#include#include#includeusing namespace std;
int main()
}sum[i] = temp;
}for(int i = 0; i < (1 << n); i ++)
for(int j = 0; j <= k; j ++)
dp[i][j] = 0x3f3f3f3f;
dp[0][0] = 0;
for(int i = 0; i < (1 << n); i ++)
dp[i][1] = sum[i];
for(int task = 1; task < (1 << n); task ++) }}
cout << dp[(1 << n) - 1][k] << endl;
return 0;
}
最佳排程問題,網上一般是用回溯法寫的,不過貌似沒看到用dp寫,所以在這裡我用dp寫寫
預備知識:狀態壓縮動態規劃,線性動態規劃
dp[task][t]表示當前的選中的任務為task數字中為1的集合,t為這些任務一共分配到t個處理機上,sub為task的子集,task-sub是乙個數字,其中的1是單獨拿出來放到一組的.
我感覺dp寫起來比回溯法好寫一些,畢竟如果程式有bug,對我而言,dp比回溯法好調一些.
程式問題不大,我在乙個較小的oj平台驗證過,只是還不夠快,目測應該還可以再優化優化
狀態壓縮DP與TSP問題
dp過程中的狀態不可能像揹包問題一樣只有整數,肯定有各種各樣稀奇古怪的狀態,需要不止乙個變數來表示。這種情況下如果需要使用dp 就必須把狀態壓縮成乙個數來表示,並且乙個數只能對應於一種狀態。特別地,對於集合我們可以把每乙個元素的選取與否對應到乙個二進位制位裡,從而把狀態壓縮成乙個整數,大大方便了計算...
狀態壓縮dp(鋪瓷磚問題)
今天蒜頭君裝修新家,給家裡買了一種 1 times 21 2的長方形 如圖1 新瓷磚。蒜頭君是個懂得審美的人,畢竟人生除了金錢,還有詩和遠方。這個時候蒜頭君就在想,這種長方形的瓷磚鋪到乙個 10 times 1010 10 的地面上有多少種方案?如圖2 是 4 times 44 4 地面的一種方案 ...
狀態壓縮dp入門 鋪磚問題
mondriaan s dream hardwood floor 第一道題目是只有一種磚,2x1可以橫著鋪,可以豎著鋪,問有多少種鋪法第二道是有兩種磚,一種是2x1的,一種是2x2的去掉乙個1x1的角也是問有多少中鋪法首先第一道我們用0 1來表示不鋪和鋪兩種狀態每一行用01字串表示狀態然後再轉化為乙...