UVA 10817 Headmaster's Headache(01背包+状压DP)

Problem D: Headmaster's Headache

Time limit: 2 seconds

The headmaster of spring Field School is considering employing some new teachers for certain subjects. There are a number of teachers applying for the posts. Each teacher is able to teach one or more subjects. The headmaster wants to select applicants so that each subject is taught by at least two teachers, and the overall cost is minimized.

Input

The input consists of several test cases. The format of each of them is explained below:

The first line contains three positive integers SM and NS (≤ 8) is the number of subjects,M (≤ 20) is the number of serving teachers, and N (≤ 100) is the number of applicants.

Each of the following M lines describes a serving teacher. It first gives the cost of employing him/her (10000 ≤C ≤ 50000), followed by a list of subjects that he/she can teach. The subjects are numbered from 1 toSYou must keep on employing all of them. After that there areN lines, giving the details of the applicants in the same format.

Input is terminated by a null case where S = 0. This case should not be processed.

Output

For each test case, give the minimum cost to employ the teachers under the constraints.

Sample Input

2 2 2
10000 1
20000 2
30000 1 2
40000 1 2
0 0 0

Sample Output

60000
 

【思路】

首先老师有选与不选两种可能,所以这是一道01背包问题,由于选择老师之后课程对于老师的需求改变了,所以要记录课程状态,S值仅为8,因此要进行状态压缩。用二进制串s1、s2分别表示至少有一个、至少有两个老师的课程状态。dp[s1][s2]记录下s1和s2状态下的老师薪资最小值,转移的时候要由高到低。一个比较麻烦的是读入,用stringstream来做比较省事,流对象的构造和析构比较费时,所以干脆只用一个对象,多次利用,每次用完都清空就好了。

【代码】

#include<iostream>
#include<cstring>
#include<algorithm>
#include<sstream>
using namespace std;

const int MAXN=130,MAXS=300,INF=0x3f3f3f3f;

int s,m,n;
int c[MAXN],p[MAXN];
int dp[MAXS][MAXS];

int main()
{
    string line;
    stringstream stream;
    while(getline(cin,line)){
        stream<<line;
        stream>>s>>m>>n;
        stream.str("");stream.clear();
        if(s==0)break;
        int curr1=0,curr2=0,sum=0;
        for(int i=1;i<=m;i++){
            getline(cin,line);
            stream<<line;
            int x,course=0;
            stream>>x;
            sum+=x;
            while(stream>>x)course|=(1<<(x-1));
            stream.str("");stream.clear();
            curr2|=(curr1&course);
            curr1|=course;
        }
        memset(c,0,sizeof(c));
        memset(dp,0x3f,sizeof(dp));
        dp[curr1][curr2]=sum;
        for(int i=1;i<=n;i++){
            getline(cin,line);
            stream<<line;
            stream>>p[i];
            int x;
            while(stream>>x)c[i]|=(1<<(x-1));
            stream.str("");stream.clear();
            for(int j=(1<<s)-1;j>=0;j--)
                for(int k=(1<<s)-1;k>=j;k--){
                    if(dp[k][j]>=INF)continue;
                    int s1=k|c[i],s2=(k&c[i])|j;
                    dp[s1][s2]=min(dp[s1][s2],dp[k][j]+p[i]);
                }
        }
        cout<<dp[(1<<s)-1][(1<<s)-1]<<endl;
    }
    return 0;
}


内容概要:本文详细介绍了如何使用Matlab对地表水源热泵系统进行建模,并采用粒子群算法来优化每小时的制冷量和制热量。首先,文章解释了地表水源热泵的工作原理及其重要性,随后展示了如何设定基本参数并构建热泵机组的基础模型。接着,文章深入探讨了粒子群算法的具体实现步骤,包括参数设置、粒子初始化、适应度评估以及粒子位置和速度的更新规则。为了确保优化的有效性和实用性,文中还讨论了如何处理实际应用中的约束条件,如设备的最大能力和制冷/制热模式之间的互斥关系。此外,作者分享了一些实用技巧,例如引入混合优化方法以加快收敛速度,以及在目标函数中加入额外的惩罚项来减少不必要的模式切换。最终,通过对优化结果的可视化分析,验证了所提出的方法能够显著降低能耗并提高系统的运行效率。 适用人群:从事暖通空调系统设计、优化及相关领域的工程师和技术人员,尤其是那些希望深入了解地表水源热泵系统特性和优化方法的专业人士。 使用场景及目标:适用于需要对地表水源热泵系统进行精确建模和优化的情景,旨在找到既满足建筑负荷需求又能使机组运行在最高效率点的制冷/制热量组合。主要目标是在保证室内舒适度的前提下,最大限度地节约能源并延长设备使用寿命。 其他说明:文中提供的Matlab代码片段可以帮助读者更好地理解和复现整个建模和优化过程。同时,作者强调了在实际工程项目中灵活调整相关参数的重要性,以便获得更好的优化效果。
内容概要:本文详细介绍了如何利用Blender和Python为污水处理厂创建高精度3D渲染效果图及其背后的参数化建模方法。首先,作者展示了如何通过Python代码管理复杂的设备数据结构(如嵌套字典),并将其应用于3D模型中,确保每个工艺段的设备参数能够准确反映在渲染图中。接着,文章深入探讨了具体的材质处理技巧,比如使用噪声贴图和溅水遮罩来增强金属表面的真实感,以及如何优化渲染性能,如采用256采样+自适应采样+OpenImageDenoise的降噪组合拳,将渲染时间缩短至原来的三分之一。此外,文中还涉及到了一些高级特性,如通过Houdini的粒子系统模拟鸟类飞行路径,或者利用Three.js实现交互式的在线展示。最后,作者强调了参数化建模的重要性,它不仅提高了工作效率,还能更好地满足客户需求,尤其是在面对紧急的设计变更时。 适合人群:从事污水处理工程设计的专业人士,尤其是那些希望提升自己3D建模技能和提高工作效率的人。 使用场景及目标:适用于需要快速生成高质量污水处理厂设计方案的场合,特别是在投标阶段或向客户展示初步概念时。通过这种方式,设计师可以在短时间内制作出逼真的效果图,帮助客户直观理解设计方案,并且可以根据客户的反馈迅速调整模型参数,从而加快决策过程。 其他说明:除了技术细节外,本文还分享了许多实用的经验和技巧,如如何平衡美观与效率之间的关系,以及怎样应对实际项目中的各种挑战。对于想要深入了解这一领域的读者来说,这是一份非常有价值的学习资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值