HDU 1074 Doing Homework (状压DP + 路径记录)

本文介绍如何使用状压动态规划解决任务安排问题,包括题意解释、状态定义、状态转移方程以及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面虽然自己已经了几篇状压DP的题解,但是这道题才是我的第一道状压DP题。


题意:有n个任务,每个任务有两个属性(d :最后期限 c :需要用的天数),主人公必须一项一项完成任务,并且每个任务完成的时间每超出最后期限一天,就要被扣一分。问他能被扣的最少的分数。多情况字典序输出方案。


设dp[S] 为完成状态S中的所有任务的被扣最少分数。

那么dp[S] = min(dp[S],dp[S-{v}] + cost);

cost 为 完成S中的所有任务所用的总时间 - 完成v的最后期限。

因为输出按照字典序,所以枚举v的时候逆序。这个稍微一想应该就明白。


我的代码:

#include<cstdio>
#include<iostream>
#include<stack>

using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 16;

struct Nod{
    char name[105];
    int d,c;
}node[maxn];
int dp[1<<maxn],pre[1<<maxn];
int n;

void solve(){
    int Ed = 1 << n;
    fill(dp,dp+Ed,inf);
    fill(pre,pre+Ed,-1);
    int day,cost,S0,tmp,cnt;
    dp[0] = 0;
    for(int S = 1;S < Ed; S++){
        for(int v = n - 1; v >= 0 ; v--){
            if(!(S >> v & 1)) continue;
            S0 = S - (1 << v);
            day = 0;cost = 0;
            for(int i = 0; i < n ; i++){
                if(S0 >> i & 1) day += node[i].c;
            }
            if(node[v].d < day + node[v].c) cost = day + node[v].c - node[v].d;
            if(dp[S] > dp[S0] + cost){
                dp[S] = dp[S0] + cost;
                pre[S] = S0;
                //cout<<S<<" "<<S0<<" "<<v<<" "<<dp[S]<<endl;
            }
        }
    }
    printf("%d\n",dp[Ed-1]);
    tmp = Ed - 1;
    stack<int> stk;
    while(pre[tmp] != -1){
        cnt = 0;
        while(!((tmp ^ pre[tmp]) >> cnt & 1)) cnt++;
        stk.push(cnt);
        tmp = pre[tmp];
    }
    while(!stk.empty()){
        int top = stk.top();stk.pop();
        printf("%s\n",node[top].name);
    }
}

int main(){
    int cas;
    scanf("%d",&cas);
    while(cas--){
        scanf("%d",&n);
        for(int i = 0 ;i < n; i++){
            scanf("%s%d%d",node[i].name,&node[i].d,&node[i].c);
        }
        solve();
    }
    return 0;
}


内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值