• codeforces 580D Kefa and Dishes


    传送门:http://codeforces.com/problemset/problem/580/d

    思路:状压DP,f[i][j]表示最后一个为i,已选取的菜的状态为j。


    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    const int maxt=540000;
    using namespace std;
    typedef long long ll; 
    int n,m,k,g[20][20],a[20],pow[20];ll f[20][maxt],ans;
    
    int main(){
    	pow[0]=1;for (int i=1;i<=19;i++) pow[i]=pow[i-1]<<1;
    	scanf("%d%d%d",&n,&m,&k);
    	for (int i=0;i<n;i++) scanf("%d",&a[i]);
    	for (int i=1,x,y,z;i<=k;i++) scanf("%d%d%d",&x,&y,&z),x--,y--,g[x][y]=z;
    	for (int i=0;i<n;i++) f[i][pow[i]]=a[i];
    	for (int i=1;i<m;i++)
    		for (int s=0;s<pow[n];s++){
    			int cnt=0;
    			for (int j=0;j<n;j++) if (s&pow[j]) cnt++;
    			if (cnt!=i) continue;
    			for (int j=0;j<n;j++)
    				if (!(s&pow[j])){
    					for (int k=0;k<n;k++)
    						if (s&pow[k])
    							f[j][s|pow[j]]=max(f[j][s|pow[j]],f[k][s]+a[j]+g[k][j]);
    				}
    		}
    	for (int s=0;s<pow[n];s++){
    		int cnt=0;
    		for (int j=0;j<n;j++) if (s&pow[j]) cnt++;
    		if (cnt!=m) continue;
    		for (int i=0;i<n;i++) ans=max(ans,f[i][s]);
    	}
    	printf("%I64d
    ",ans);
    	return 0;
    }


  • 相关阅读:
    docker commit
    镜像原理
    docker command1
    docker镜像命令
    docker work machine
    视图
    后台管理
    模型类
    docker command
    安装virtualenv
  • 原文地址:https://www.cnblogs.com/thythy/p/5493527.html
Copyright © 2020-2023  润新知