馬上假期就要結束了,zjm還有 n 個作業,完成某個作業需要一定的時間,而且每個作業有乙個截止時間,若超過截止時間,一天就要扣一分。
zjm想知道如何安排做作業,使得扣的分數最少。
tips: 如果開始做某個作業,就必須把這個作業做完了,才能做下乙個作業。
輸入格式:
有多組測試資料。第一行乙個整數表示測試資料的組數
第一行乙個整數 n(1<=n<=15)
接下來n行,每行乙個字串(長度不超過100) s 表示任務的名稱和兩個整數 d 和 c,分別表示任務的截止時間和完成任務需要的天數。
這 n 個任務是按照字串的字典序從小到大給出。
輸出格式:
每組測試資料,輸出最少扣的分數,並輸出完成作業的方案,如果有多個方案,輸出字典序最小的乙個。
樣例輸入:
2樣例輸出:3computer 3 3
english 20 1
math 3 2
3computer 3 3
english 6 3
math 6 3
2狀壓dpcomputer
math
english
3computer
english
math
(1)狀態定義
f[s]表示完成 s 作業集合後被扣的最少分數 (s是被2進製壓縮後的十進位制數,把每乙個任務做與不做用 0/1表示 第i位為1表示該狀態中已經做了該任務)
(2)狀態方程
定義 c[x] = 作業 x 完成所需時間 ,d[x] = 作業 x 的 ddl ,sum = s 作業集合對應的總時間
tmp = max ( sum + c[x] – d[x], 0 ) (temp是作業 x 被扣的分數)
所以得到 f[s|(1<#include
#include
#include
#include
using
namespace std;
const
int msize=
1<<15;
int f[msize]
,pre[msize]
,sum[msize]
;string task[20]
;int c[20]
,d[20];
int m,n;
void
output
(int n)
intmain()
} cout<