uva 10817 Headmaster's Headache 出发dp 位计算

uva 10817 Headmaster's Headache 出发dp 位计算

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

出发dp,用在一些议题的操作非常~ 

给出s个课程。m个教师。n个求职者,教师必须招聘。然后招聘一些求职者,使得每一门课都至少有两个老师能教。问题就转换成了招聘哪些求职者使得花费最少。由于s范围小于8。则能够用二进制表示,用集合s1表示恰好有一个人教的课的集合,用集合s2表示有两个人教的课的集合,则每次状态转移即为选择这名求职者还是不选(教师必须选)详细看代码。

 

d(i,s1,s2) = min{ d(i+1,s1′,s2′)+c[i],d(i+1,s1,s2)} 第一项表示聘用,第二项表示不聘用。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define mem(name,value) memset(name,value,sizeof(name))
#define FOR(i,n) for(int i=1;i<=n;i++)
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=130;
const int maxs=8;
int n,m,s,d[maxn][1<<maxs][1<<maxs],st[maxn],c[maxn];//st表示第i个人能够教的课程的集合。c表示花费
void init(){
    mem(d,-1); mem(st,0); mem(c,0);
    for(int i=0;i<m+n;i++){
        scanf("%d",c+i);
        while(1){
            int t; char c1;
            scanf("%d",&t);
            st[i] |= (1<<(t-1));
            c1 = getchar();
            if(c1=='\n') break;
        }
    }
}
int dp(int i,int s0,int s1,int s2){ //s0 表示恰好一个人都没有教的课的集合。也能够用s1和s2算出来。
    if(i==m+n) return s2==(1<<s)-1?0:inf;
    //假设已经考虑到第m+n个人了,编号是1~m+n-1,则人已经选完。若s2集合中没有全部课。则不符合题意。
    int& ans = d[i][s1][s2];
    if(ans!=-1) return ans;
    ans = inf;
    if(i>=m) ans = dp(i+1,s0,s1,s2);    //仅仅有当选择求职者的时候才用考虑是否聘用。

int m0 = st[i]&s0, m1 = st[i]&s1; //m0表示在一个人都没有教的课中,第i个人能够教哪些,m1同理。

s0=s0^m0; s1=(s1^m1)|m0; s2=s2|m1; //将s0中有人教的课去掉。算到s1上。s2同理 ans = min(ans,c[i]+dp(i+1,s0,s1,s2)); //和不聘用的价格比較 return ans;}int main(){ // freopen("in.txt","r",stdin); while(~scanf("%d%d%d",&s,&m,&n) && s && m &&n){ init(); int ans = dp(0,(1<<s)-1,0,0); //答案为还没考虑不论什么一个人,和没有不论什么一门课有人教 printf("%d\n",ans); } return 0;}

 

 

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117670.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils「建议收藏」

    Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils

    2022年1月16日
    54
  • C语言的运算符及优先级[通俗易懂]

    C语言的运算符及优先级[通俗易懂]C语言的运算符包括单目运算符、双目运算符、三目运算符,优先级如下:第1优先级:各种括括号,如()、[]等、成员运算符.;第2优先级:所有单目运算符,如++、–、!、~等;第3优先级(算数运算符):乘法运算符*、除法运算符/、求余运算符%;第4优先级(算数运算符):加法运算符+、减法运算符-;第5优先级(移位运算符):移位运算符<<、>>;第6优先级(条件运算符):大于运算符>、大于等于运算符>=、小于运算符<、小于等于运算符<=;第7优先级(

    2025年6月11日
    2
  • C++ Qt常用面试题整理(不定时更新)[通俗易懂]

    C++ Qt常用面试题整理(不定时更新)[通俗易懂]1.Qt多线程同步的几种实现方式(1)互斥量:QMutexQMutex类提供的是线程之间的访问顺序化。QMutex的目的是保护一个对象/数据结构或者代码段在同一时间只有一个线程可以访问。基本使用方法如下:QMutexmutex;intvar;voidfunction(){mutex.lock();//访问varvar*var;mutex.unlock();}如果使用mutex加锁,却没有使用unlock解锁,那么就会造成..

    2022年6月25日
    43
  • 【Java】爬虫,看完还爬不下来打我电话[通俗易懂]

    前言防砸声明:此文仅仅能保证入门,不保证商业生产。最终实现效果:爬虫简介:引用钱洋博士课程的部分内容(有删改):网络爬虫技术,有效的获取网络数据资源的重要方式。简单的理解,比如您对百度贴吧的一个帖子内容特别感兴趣,而帖子的回复却有1000多页,这时采用逐条复制的方法便不可行。而采用网络爬虫便可以很轻松地采集到该帖子下的所有内容。网络爬虫的作用,我总结为以下几点:舆情分析:企业或…

    2022年4月13日
    98
  • matlab中如何调用lm算法,lm算法的matlab实现「建议收藏」

    matlab中如何调用lm算法,lm算法的matlab实现「建议收藏」inlm’);%下面使用遗传算法对网络进行优化P=XX;T=YY;R=size(P,1);S2=size(T,1);S1=25;%隐含层节点数S=R*S1+S1*S2+S1+S2;%遗传算法编码……实现nfc95p算法的matlab程序_数学_自然科学_专业资料。cleara…{on}|off]例子1用matlab实现对fmsinsin2…lm1;…

    2022年9月30日
    4
  • IDEA 热部署设置(JRebel插件激活)「建议收藏」

    IDEA 热部署设置(JRebel插件激活)「建议收藏」1.打开File&gt;&gt;setting,选择Plugins&gt;&gt;BrowseRepositories2.搜索Jrebel找到JRebelforIntelliJ,选择install安装                            3. 打开File-&gt;setting,选择JRebel&gt;&gt;…

    2022年6月11日
    154

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号