任務安排 動態規劃dp 狀態壓縮

2021-10-07 03:01:09 字數 1256 閱讀 9567

馬上假期就要結束了,zjm還有 n 個作業,完成某個作業需要一定的時間,而且每個作業有乙個截止時間,若超過截止時間,一天就要扣一分。

zjm想知道如何安排做作業,使得扣的分數最少。

tips: 如果開始做某個作業,就必須把這個作業做完了,才能做下乙個作業。

有多組測試資料。第一行乙個整數表示測試資料的組數

第一行乙個整數 n(1<=n<=15)

接下來n行,每行乙個字串(長度不超過100) s 表示任務的名稱和兩個整數 d 和 c,分別表示任務的截止時間和完成任務需要的天數。

這 n 個任務是按照字串的字典序從小到大給出。

每組測試資料,輸出最少扣的分數,並輸出完成作業的方案,如果有多個方案,輸出字典序最小的乙個。

2

3computer 3

3english 20

1math 323

computer 3

3english 6

3math 6

3

2

computer

math

english

3computer

english

math

在第二個樣例中,按照 computer->english->math 和 computer->math->english 的順序完成作業,所扣的分數都是 3,由於 english 的字典序比 math 小,故輸出前一種方案。

我們發現作業每超過截止時間一天,需要扣一分,情況複雜,難以貪心。資料範圍非常小,1<=n<=15資料範圍比較小,可以採用狀態壓縮的方法dp解決。

令s表示當前完成的作業集合。

狀態定義

• f[s] 表示完成 s 作業集合後被扣的最少分數

• 轉移方程

• sum = s 作業集合對應的總時間

• f[s|(1<#include

#include

#include

using

namespace std;

struct worka[16]

;int f[

1<<16]

,pre[

1<<16]

,sum[

1<<16]

;void

output

(int x)

intmain()

}}} cout<<]

1<);

}return0;

}

動態規劃 狀態壓縮dp

if cnt 1 return false 用來判斷像01這種最後是0的情況 return true int main return 0 預處理所有狀態是否為合法狀態 include include include using namespace std typedef long long ll c...

動態規劃 dp狀態的壓縮

1312.讓字串成為回文串的最少插入次數 給你乙個字串 s 每一次操作你都可以在字串的任意位置插入任意字元。請你返回讓 s 成為回文串的 最少操作次數 回文串 是正讀和反讀都相同的字串。示例 1 輸入 s zzazz 輸出 0 解釋 字串 zzazz 已經是回文串了,所以不需要做任何插入操作。示例 ...

狀態壓縮動態規劃(狀壓DP)

狀態壓縮動態規劃就是我們常說的狀壓dp,前兩天某廠實習生二面面試官隨手就給我抽了一道狀壓dp的題,我根本沒思路,sorry就寫了一行注釋。然後leetcode周賽最後一題又碰到了狀壓dp的題目,我一定要搞定這個型別的問題。加油加油 狀壓dp說簡單也簡單,基本上就是用一串二進位制樹來表示當前情況 的狀...