我們可以斷定狀態的終止態一定是n個數全部選完的情況,那麼它的前乙個狀態是什麼呢,一定是剔除任一門課程後的n種狀態。
例如dp[全選了]=min那麼接下來的dp狀態依然如此。
好了,接下來,我們該如何去思考了,這個題目共有2^15種可能情況,對此我們通過位運算的方法降低它的維度。
二進位制的每一位代表一門課,它的組合可以完成展示出所有的狀態。
最後我們應該去思考乙個問題,順序的問題,我們知道,第一次取得時候,一定只有乙個課程,如果我們以
1int bit = 1
<2for(int i = 1;i能否確保某乙個狀態的前乙個都完全包含,你可以自己去檢驗,是完全滿足的.
**:1 #include2 #include3 #include4 #include5
using
namespace
std;
6const
int maxn = (1
<<15)+10;7
const
int inf = 0x3f3f3f;8
struct
node9;
14 node nd[20
];15
intdp[maxn],pre[maxn],t[maxn];
16void output(int
x)17
23int
main()
2437
/*for(int i = 1;i<=n;i++)
38*/
41int bit = 1
<42for(int i = 1;i)
4361}62
else
6370}71
}72}73
}74 cout<1]<75 output(bit-1
);76}77
return0;
78 }
hdu1074狀態壓縮
很明顯的狀態壓縮題目。當然了如果他的意識只有是求最小值沒有要求輸出那個輸出的順序,那麼直接用揹包,甚至是貪心都是可以做出來的,但是要求順序這個揹包的話沒有辦法吧資料記錄下來。所以用二進位制壓縮。所謂的二進位制壓縮就是用二進位制來表示事情的完成程度和狀況,比如1,就是0000001表示第乙個作業做了,...
hdu 1074 狀態壓縮dp
題目描述 有 n 門課程的作業,每門都有完成期限d,與完成所需時間c,若超過期限,1天扣1分。問完成這n門作業至少要扣多少分,並輸出扣分最少的做作業順序。思路 dp i 記錄完成狀態為i的情況下的資訊。完成所需時間,上乙個狀態,最小扣分 狀態方程 dp i min dp j cost j,i 從j狀...
HDU 1074 狀態壓縮dp
起初想到貪心沒思路 看了題解 狀態壓縮dp 最多15個狀態 1,1 include stdio.h include stdlib.h include string.h include algorithm include include define n 1 15 5 define inf 1 30 ...