HDU1074(状压DP入门题)

这道题关于字典序为什么要逆序,还有如何记录状态路径做了示范,是一道非常有启发的题目。

还有就是贪心可以做,但是做不出字典序的效果

a 1 1 1 b 1 2 1 c 1 1 1 

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node
{
    string s;
    int d,c;
};
struct rcr
{
    int value=0,pre=0,now=0,time=0;
};
void printans(vector<rcr> dp,int n,vector<node> sbj)
{
    if(dp[n].pre)
    printans(dp,dp[n].pre,sbj);
    cout<<sbj[dp[n].now].s<<'\n';
}
int main()
{
    //ios::sync_with_stdio(false);
    int t;cin>>t;
    while(t--)
    {
        int n;cin>>n;
        vector<node> sbj(n+1);
        for(int i=0;i<n;i++)
          cin>>sbj[i].s>>sbj[i].d>>sbj[i].c;
        vector<rcr> dp(1<<n);
        for(int i=1;i<(1<<n);i++)
        {
            dp[i].value=0x3f3f3f3f;
            for(int j=n-1;j>=0;j--)
            {
                int tmp=1<<j;
                if(i&tmp)
                {
                   int f=i-tmp;
                   if(dp[i].value>dp[f].value+max(dp[f].time+sbj[j].c-sbj[j].d,0))
                   {

                       dp[i].value=dp[f].value+max(dp[f].time+sbj[j].c-sbj[j].d,0);
                       dp[i].time=dp[f].time+sbj[j].c;
                       dp[i].pre=f;
                       dp[i].now=j;
                   }
                }
            }
        }
        cout<<dp[(1<<n)-1].value<<'\n';
        printans(dp,(1<<n)-1,sbj);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值