Doing Homework HDU

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=(1<<15)+5;
const int MOD=1e9+7;
int dead[20],cost[20];
int dp[MAXN],t[MAXN];
char s[20][105];
int pre[MAXN];
void print(int x)
{
    if(x==0)
        return;
    print(x^(1<<pre[x]));
    printf("%s
",s[pre[x]] );
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(pre,0,sizeof pre);
        int n;
        scanf("%d",&n);
        for(int i=0; i<n; i++)
            scanf("%s%d%d",s[i],&dead[i],&cost[i] );
        for(int i=1; i<(1<<n); i++)
        {
            dp[i]=INF;
            for(int j=n-1; j>=0; j--)
            {
                int tmp=1<<j;
                //如果没有做 
                if(! (i&tmp) )
                    continue;
                //做这个题之后的分数+花费-期限=扣得分 
                int score=t[i^tmp]+cost[j]-dead[j];
                //如果小于,说明不扣分 
                if(score<0)
                    score=0;
                //如果当前的状态扣的分数   >  做这个题之后扣的分 
                if(dp[i]>dp[i^tmp]+score)
                {
                    //分数
                    dp[i]=dp[i^tmp]+score;
                    //花的时间
                    t[i]=t[i^tmp]+cost[j];
                    //转移状态,这个状态下做的题 
                    pre[i]=j;
                }
            }
        }
        printf("%d
", dp[(1<<n)-1]);
        print((1<<n)-1);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12238191.html