TYVJ2018小猫下山

来源:互联网 发布:js给select标签负值 编辑:程序博客网 时间:2024/06/02 15:55

背景

Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。

描述

Freda和rainbow只好花钱让它们坐索道下山。索道上的缆车最大承重量为W,而N只小猫的重量分别是C1、C2……CN。当然,每辆缆车上的小猫的重量之和不能超过W。每租用一辆缆车,Freda和rainbow就要付1美元,所以他们想知道,最少需要付多少美元才能把这N只小猫都运送下山?

输入格式

第一行包含两个用空格隔开的整数,N和W。
接下来N行每行一个整数,其中第i+1行的整数表示第i只小猫的重量Ci。

输出格式

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





//DFS解法
//枚举每一辆车搜索太过繁琐,枚举每只猫即可 
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,w;
int g[30];//猫重量 
unsigned int minc=999999;//记录最优解 
unsigned int gcart[30];//车载重量 
void search(int t,unsigned int now){//t_猫数目 now_车数目 
int i;
if(now>=minc) return;
if(t>n){
minc=min(minc,now);
return;
}
for(i=1;i<=now;i++){
if(gcart[i]+g[t]<=w){
gcart[i]+=g[t];
search(t+1,now);
gcart[i]-=g[t];//记得复原 
}
}
//现有车都不能满足需求时,加一辆新的车 
gcart[now+1]=g[t];
search(t+1,now+1);
gcart[now+1]=0;
return;
}
int main(){
scanf("%d%d",&n,&w);
int i,j;
for(i=1;i<=n;i++)scanf("%d",&g[i]);
search(1,1);
printf("%d",minc);
return 0;
}

//结束


剪枝:

前i只猫最多用i辆车,枚举时候不需要超过i

搜索中车数超过已知最优解时直接return

unsigned大法好,加了以后AC,不加会错一个点,莫名神奇


这种搜法能过仅是因为数据规模小

以后若写了更优算法补在后面

0 0
原创粉丝点击