• 小猫爬山:dfs


    题目描述:

    翰翰和达达饲养了N只小猫,这天,小猫们要去爬山。

    经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。

    翰翰和达达只好花钱让它们坐索道下山。

    索道上的缆车最大承重量为W,而N只小猫的重量分别是C1、C2……CN。

    当然,每辆缆车上的小猫的重量之和不能超过W。

    每租用一辆缆车,翰翰和达达就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山?

    输入格式

    第1行:包含两个用空格隔开的整数,N和W。

    第2..N+1行:每行一个整数,其中第i+1行的整数表示第i只小猫的重量CiCi。

    输出格式

    输出一个整数,表示最少需要多少美元,也就是最少需要多少辆缆车。

    数据范围

    1≤N≤18,
    1≤Ci≤W≤10^8

    输入样例:

    5 1996

    1

    2

    1994

    12

    29

    输出样例:

    2

     

     

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n, w, c[20],car[20];
    int flag = 1e8;
    
    int cmp(int a, int b) {
    	return a > b;
    }
    
    void dfs(int x, int cnt) {		//x:猫 cnt:车的辆数
    	if (cnt >= flag)return;
    	if (x == n) {
    		flag = min(cnt, flag);
    		return;
    	}
    	for (int i = 0; i < cnt; i++) {
    		if (c[x] <= car[i]) {			//满足装车条件,
    			car[i] -= c[x];
    			dfs(x + 1, cnt);
    			car[i] += c[x];
    		}
    	}
    		car[cnt] -= c[x];			//开新车,注意是car[cnt],cnt=5;代表的是编号从0~4的车
    		dfs(x + 1, cnt + 1);		
    		car[cnt] = w;				//回溯新车
    }
    int main() {
    	cin >> n >> w;
    	for (int i = 0; i < n; i++) {
    		cin >> c[i];
    		car[i] = w;
    	}
    	sort(c,c+n,cmp);			//大到小排序
    	dfs(0, 1);					//编号为零的猫开始,一辆车
    	cout << flag << "
    ";
    }
    

      

  • 相关阅读:
    Eclipse中配置约束(DTD,XSD)
    Eclipse集成tomcat
    java使用dom4j对XML进行CURD操作
    SQL数据库操作(CURD)
    Java-IO流总结
    Java-集合框架总结
    AES apache commons-crypto 对称加密
    Redis
    Axis2 客户端调用 设置超时时间
    Sybase 修改数据库默认排序
  • 原文地址:https://www.cnblogs.com/52dxer/p/10455949.html
Copyright © 2020-2023  润新知