zoukankan      html  css  js  c++  java
  • luogu P3052 [USACO12MAR]Cows in a Skyscraper G

    dfs

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,c[19],v[19];
    bool dfs(int x,int num)//num为车厢号 
    {
    	for(int i=1;i<=x&&i<=num;i++)
    	{
    		if(v[i]+c[x]<=m)
    		{
    			v[i]+=c[x];
    			if(x==n)
    				return 1;
    			if( dfs(x+1,num) )
    				return 1;
    			v[i]-=c[x];
    		}
    	}
    	return false;
    } 
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    		cin>>c[i];
    	for(int i=1;i<=n;i++)
    	{
    		fill(v+1,v+1+n,0);
    		if(dfs(1,i))
    		{
    			cout<<i<<endl;
    			break;
    		}
    	}
    	return 0;
    }
    

    dp

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,w;
    int a[20];
    int f[1<<18];//f[i]状态为i的最小次数
    int g[1<<18];//g[i]状态为i时,最后一个电梯的剩余体积
    int main() {
    	cin>>n>>w;
    	for(int i=0; i<n; i++)
    		cin>>a[i];
    	fill(f,f+(1<<18)+1,1e9+10);
    	f[0]=1;
    	g[0]=w;
    	for(int i=0; i< (1<<n); i++ ) { //枚举状态
    		for(int j=0; j<n; j++) {
    			if(i&(1<<j))
    				continue;
    			if(g[i]>=a[j]&&f[i|(1<<j)]>=f[i]) {
    				f[i|(1<<j)]=f[i];
    				g[i|(1<<j)]=max(g[i|(1<<(j))],g[i]-a[j]);
    			} else if(g[i]<a[j] || f[i|(1<<(j))]>=f[i]+1) {
    				f[i|(1<<(j))]=f[i]+1;//电梯次数+1
    				g[i|(1<<(j))]=max(g[i|(1<<(j))],w-a[j]);
    			}
    		}
    	}
    	printf("%d",f[(1<<n)-1]);
    	return 0;
    }
    
  • 相关阅读:
    docker构建镜像
    SpringBoot 配置的加载
    Gradle实战(02)--Gradle Build的创建
    Gradle实战(01)--介绍与安装
    统计最常用10个命令的脚本
    jackson序列化与反序列化的应用实践
    go http请求流程分析
    java线程的3种实现方式及线程池
    git多账号使用
    java多版本管理
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12593942.html
Copyright © 2011-2022 走看看