hdoj 1074 Doing Homework 【状态压缩dp】

这是一篇关于解决hdoj 1074问题的博客,主要介绍了如何利用状态压缩动态规划(DP)方法找到任务安排的最小扣分方案。题目中涉及15个任务,每个任务有截止日期和所需完成天数,超期一天会扣一分。博主通过状态压缩枚举所有可能的状态,并定义dp数组来存储在特定状态下最小的扣分数。转移方程为dp[st | (1<<i)] = min(dp[st | (1<<i)], dp[st] + 当前i超期的扣分),并使用额外的数组记录状态转移以便回溯输出结果。" 135679444,11619605,ICC2:解决initial_floorplan中flip_first_row问题,"['后端开发', '集成电路', '学习']
摘要由CSDN通过智能技术生成

题目:hdoj 1074 Doing Homework 


题意:给出一些任务15个,每个任务有截至时间和需要做的天数,超期一天扣一分,求让扣分最小的安排方案。


分析:用状态压缩枚举所有的状态,dp【st】表示在st状态下的最小扣分

转移方程:dp【st | (1<<i)】 = min( dp[st | ( 1 << i ) ] , dp[ st ] + 当前 i 超期的扣分 )


注意这个题目需要打印路径,所以还要一个数组保存状态的转移,递归输出结果即可。


AC

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int N = 16;
int dp[1<<N];
struct Node
{
    string s;
    int time,cost;
};
Node a[N];
int pre[1<<N];
int n;
void Output(int status)
{
    if(status==0)return;
    int t=0;
    for(int i=0;i<n;i+&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值