UVa 10817 不会子集的二进制表示法

来源:互联网 发布:靠谱的网络兼职 编辑:程序博客网 时间:2024/05/21 09:08
#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<sstream>#include<iostream>using namespace std;const int INF=0x3f3f3f3f;const int maxn=125;const int maxs=8;int s,n,m,c[maxn],st[maxn],d[maxn][1<<maxs][1<<maxs];int dp(int i,int s0,int s1,int s2){   if(i==m+n) return s2==(1<<s)-1 ? 0: INF;   int& ans=d[i][s1][s2];   if(ans>=0) return ans;   ans=INF;   if(i>=m) ans=dp(i+1,s0,s1,s2);   int m0=st[i]&s0, m1=st[i]&s1;//m0是该教师能教且现在没人教的科目,m1是能教且现在只有一个人教的集合   s0^=m0;s1=(s1^m1)|m0;s2|=m1;   ans=min(ans,c[i]+dp(i+1,s0,s1,s2));   return ans;}int main(){   string line;    int x;     while(getline(cin,line))     {          stringstream ss(line);          ss>>s>>m>>n;         if(s==0)            break;            memset(st,0,sizeof(st));          for(int i=0;i<m+n;i++)          {              getline(cin,line);              stringstream ss(line);              ss>>c[i];              while(ss>>x)              st[i]|=(1<<(x-1));          }          memset(d,-1,sizeof(d));          printf("%d\n",dp(0,(1<<s)-1,0,0));     }    return 0;}
还不是很理解这个啊,主要是二进制的这个理解的还不够,代码完全复制,需要学习啊。
0 0
原创粉丝点击