思路:状态压缩dp
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
//状态结构体
struct state{
int prestate,precourse, minreduce, usedtime;
};
//课程结构体
struct course{
int deadline, cost;
string name;
};
state states[1 << 15];
vector<course> courses;
void solve(int n)
{
states[0].prestate = -1;
states[0].minreduce = 0;
states[0].precourse = -1;
states[0].usedtime = 0;
for (int i = 1; i < (1 << n); i++)
{
states[i].minreduce = 99999999;
for (int j = n; j >= 0; j--)//逆课程字典序循环
{
if (i & (1 << j))
{
int temp = i - (1 << j);
int reduce = states[temp].usedtime + courses[j].cost - courses[j].deadline;
if (reduce < 0)
reduce = 0;
if (states[i].minreduce > states[temp].minreduce + reduce)
{
states[i].minreduce = states[temp].minreduce + reduce;
states[i].precourse = j;
states[i].prestate = temp;
states[i].usedtime = states[temp].usedtime + courses[j].cost;
}
}
}
}
vector<int> sta;
sta.clear();
int ts = (1 << n) - 1;
while (states[ts].prestate != -1)
{
sta.push_back(states[ts].precourse);
ts = states[ts].prestate;
}
cout << states[(1 << n) - 1].minreduce << endl;
for (int i = sta.size()-1; i >= 0; i--)
cout << courses[sta[i]].name << endl;
}
int main()
{
int t;
cin >> t;
for (int i = 0; i < t; i++)
{
int n;
cin >> n;
courses.clear();
for (int j = 0; j < n; j++)
{
string cn;
int dl, c;
cin >> cn >> dl >> c;
courses.push_back(course{dl,c,cn});
}
solve(n);
}
return 0;
}