算法实验二 【装载问题】(回溯算法)

算法实验二 【装载问题】(回溯算法)

1005.装载问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述

有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。

输入

多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi (i=1…n)。n等于0标志输入结束。

输出

对于每个测例在单独的一行内输出Yes或No。

输入样例

7 8 2
8 7
7 9 2
8 8
0 0 0

输出样例

Yes
No

#include<iostream>
#include<math.h>
using namespace std;

int c1,c2,n;//船的载重量和集装箱个数
int weight=0;//集装箱总重量 
int a[10];//集装箱重量
int used[10];//集装箱是否被用过
int maxn,now;//能装入c1的最大值和当前值

void dfs(int m);
bool canplace(int m);

int main()
{
	cin>>c1>>c2>>n;
	while(n)
	{
		maxn=now=weight=0;
		for(int i=0;i<n;i++) 
		{
		 cin>>a[i];
		 weight+=a[i];
		} 
		dfs(0);
		if(weight-maxn<=c2) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
		cin>>c1>>c2>>n;
	}
	return 0;
 } 
 
void dfs(int m)
 {
 	if(m==n)
 	{
 		maxn=max(maxn,now);
	 }
	 else
	 {
	 	if(canplace(m))
	 	{
	 		used[m]=1;
	 		now+=a[m];
	 		dfs(m+1);
	 		used[m]=0;
	 		now-=a[m];
		 }
		 dfs(m+1);
	 }
 }
 
bool canplace(int m)
{
	if(used[m]) return false;
	else if(now+a[m]>c1) return false;
	return true;
}

10.22日复习
这道题看着像是两个变量的题,但是其实是一个
找出能在第一艘船上装载的集装箱最大重量,如果总重量减去最大重量能在第二艘船放下,就输出Yes即可

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值