题目描述
输入
输出
• 单个整数:表示奶牛们可以获得的最大得分
样例输入
样例输出
提示
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 const int N=20; 8 struct node{ 9 int p,add; 10 }; 11 vector<node>q[N+5]; 12 int s[N+5][N+5],F[1<<N]; 13 bool cmp(const node &p,const node &q){return p.p<q.p;} 14 int getday(int x) 15 { 16 int cnt=0; 17 while(x) 18 { 19 cnt++; 20 x-=(x&(-x)); 21 } 22 return cnt; 23 } 24 int main() 25 { 26 int n,m,x,y,z; 27 scanf("%d%d",&n,&m); 28 for(int i=1;i<=m;i++) 29 { 30 scanf("%d%d%d",&x,&y,&z); 31 q[x].push_back((node){y,z}); 32 } 33 for(int i=1;i<=n;i++)sort(q[i].begin(),q[i].end(),cmp); 34 for(int i=1;i<=n;i++) 35 for(int j=1;j<=n;j++) 36 scanf("%d",&s[i][j]); 37 int mk=(1<<n)-1,now,tmp; 38 for(int i=0;i<mk;i++) 39 { 40 now=getday(i); 41 for(int j=1;j<=n;j++) 42 { 43 if((1<<(j-1))&i)continue; 44 tmp=F[i]+s[j][now+1]; 45 for(int k=0,sz=q[now+1].size();k<sz;k++) 46 if(tmp>=q[now+1][k].p)tmp+=q[now+1][k].add; 47 F[i|(1<<(j-1))]=max(F[i|(1<<(j-1))],tmp); 48 } 49 } 50 printf("%d",F[mk]); 51 return 0; 52 }