1011--Sticks

题意:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的。对于给定的一组小木棒,请求出原始木棒的最小长度。

经典搜索题,注意搜索中的剪枝,否则会超时。


#include <iostream>
#include<algorithm>
#include<functional>
using namespace std;

int n;
int stick[100];
bool isChoose[100];

bool search(int totallength,int curlength,int used)
{
	if(used==n && curlength==totallength) return true;
	if(curlength==totallength) curlength=0;
	if(curlength+stick[n-1]>totallength) return false; //没什么效果
	for(int i=0;i<n;i++)
	{
		if(isChoose[i]) continue;
		if(curlength+stick[i]>totallength) continue;
		isChoose[i]=1;
		if(search(totallength,curlength+stick[i],used+1))
			return true;
		isChoose[i]=0;
		if(curlength+stick[i]==totallength || curlength == 0) /*第一个条件对应当前木棒刚好能组成一根大木棒,第二个条件对应当前木棒是组合开始时的第一个木棒。*/
			break;
	}
	return false;
}

int main()
{
	while(true)
	{
		cin>>n;
		if(n==0 ) break;
		int sum=0;
		for(int i=0;i<n;i++)
		{
			cin>>stick[i];
			sum+=stick[i];
		}
		memset(isChoose,0,sizeof(isChoose));
		sort(stick,stick+n,greater<int>());
		for(int i=n;i>=1;i--) //这里从木棒的数目遍历比从木棒的长度遍历的次数要少
		{
			if( sum%i==0 && sum/i>=stick[0])
				if(search(sum/i,0,0))
				{
					cout<<sum/i<<endl;
					break;
				}
		}
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较经典的小游戏,我可以用C语言帮您实现。以下是代码实现: ```c #include <stdio.h> int main() { int sticks = 21; // 初始火柴数 int take, computerTake; // 玩家和计算机取的火柴数 printf("Game begin:\n"); while (sticks > 0) { printf("%d sticks left in the pile.\n", sticks); printf("How many sticks do you wish to take (1~4)? "); scanf("%d", &take); while (take < 1 || take > 4 || take > sticks) { printf("Illegal move. Please try again.\n"); printf("How many sticks do you wish to take (1~4)? "); scanf("%d", &take); } sticks -= take; if (sticks == 0) { printf("%d sticks left in the pile.\n", sticks); printf("You have taken the last sticks.\n"); printf("***You lose!\nGame Over.\n"); break; } computerTake = (5 - take) % 5; printf("%d sticks left in the pile.\n", sticks); printf("Computer take %d sticks.\n", computerTake); sticks -= computerTake; if (sticks == 0) { printf("%d sticks left in the pile.\n", sticks); printf("Computer has taken the last sticks.\n"); printf("***You win!\nGame Over.\n"); break; } } return 0; } ``` 程序中,我们使用了一个 while 循环,不断进行玩家和计算机的取火柴操作,直到火柴数量为 0。每次玩家取火柴前,都会判断其取的火柴数量是否合法,不合法则要求重新输入。而计算机则根据玩家取的火柴数量,采用一定的策略来取火柴。这里,我们使用了一个简单的策略:让计算机取的火柴数量加上玩家取的火柴数量等于 5。这样,计算机就可以在保证不输的前提下,尽可能地拖延游戏进程,增加玩家输的可能性。 运行程序后,可以按照提示进行游戏。如果您想让计算机更聪明一些,可以尝试采用其他的策略,比如根据当前剩余的火柴数和玩家的取火柴数量,来决定计算机应该取多少火柴。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值