洛谷 P3052 USACO 摩天大楼里的奶牛Cows in a Skyscraper

题目描述

A little known fact about Bessie and friends is that they lovestair climbing races. A better known fact is that cows really don't like goingdown stairs. So after the cows finish racing to the top of their favoriteskyscraper, they had a problem. Refusing to climb back down using the stairs,the cows are forced to use the elevator in order to get back to the groundfloor.

The elevator has a maximum weight capacity of W (1 <= W <=100,000,000) pounds and cow i weighs C_i (1 <= C_i <= W) pounds. Pleasehelp Bessie figure out how to get all the N (1 <= N <= 18) of the cows tothe ground floor using the least number of elevator rides. The sum of theweights of the cows on each elevator ride must be no larger than W.

给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组。(n<=18)

输入输出格式

输入格式:
* Line 1: N and W separated by a space.

* Lines 2..1+N: Line i+1 contains the integer C_i, giving theweight of one of the cows.

输出格式:
* A single integer, R, indicating the minimum number of elevator rides needed.

one of the R trips down the elevator.

输入输出样例

输入样例#1 

4 10 
5 
6 
3 
7 

输出样例#1 

3 

说明

There are four cows weighing 5, 6, 3, and 7 pounds. The elevatorhas a maximum weight capacity of 10 pounds.

We can put the cow weighing 3 on the same elevator as any othercow but the other three cows are too heavy to be combined. For the solutionabove, elevator ride 1 involves cow #1 and #3, elevator ride 2 involves cow #2,and elevator ride 3 involves cow #4. Several other solutions are possible forthis input.

题解:这道题目直接暴力枚举答案,然后进行DFS将这些牛进行分配,判断是否可以即可。

#include <cstdio>
#include <cstring>
int n,w,a[30],sum[30];
using namespace std;
bool dfs(int cow,int s)
{
	for (int i=1;i<=cow && i<=s;i++)
	  if (sum[i]+a[cow]<=w)
	  {
	  	sum[i]+=a[cow];
	  	if (cow==n) return 1;
	  	if (dfs(cow+1,s)) return 1;
	  	sum[i]-=a[cow];
	  }
	return 0;
}
int main()
{
	scanf("%d%d",&n,&w);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	for (int i=1;i<=n;i++)
	{
		memset(sum,sizeof(sum),0);
		if (dfs(1,i))
		{
			printf("%d\n",i);
			return 0;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouhongkai06/article/details/80559475