• uva10344 23 out of 5


    Your task is to write a program that can decide whether you can nd an arithmetic expression consisting
    of ve given numbers ai (1  i  5) that will yield the value 23.
    For this problem we will only consider arithmetic expressions of the following from:
    (((a(1) o1 a(2)) o2 a(3)) o3 a(4)) o4 a(5)
    where  : f1;2;3;4;5g ! f1;2;3;4;5g is a bijective function and oi 2 f+; ;g(1  i  4)
    Input
    The Input consists of 5-Tupels of positive Integers, each between 1 and 50.
    Input is terminated by a line containing ve zero's. This line should not be processed. Input le
    will have no more than 25 lines.
    Output
    For each 5-Tupel print `Possible' (without quotes) if their exists an arithmetic expression (as described
    above) that yields 23. Otherwise print `Impossible'.
    Sample Input
    1 1 1 1 1
    1 2 3 4 5
    2 3 5 7 11
    0 0 0 0 0
    Sample Output
    Impossible
    Possible
    Possible

    题目大意如下:给定5个正整数,和一个算术集合{+,-,*},求23点。

    思路:因为24点或23点或n点的计算公式为(((a(1) o1 a(2)) o2 a(3)) o3 a(4)) o4 a(5),可知需要在5个正整数中选定一个初始的数来作为基础值,所以枚举此数,再进行回溯。

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int a[6];
    bool vis[6];
    bool read()
    {
    	bool useable=0;
    	for(int i=0;i<5;i++){
    		scanf("%d",&a[i]);
    		if(a[i])useable=1;
    	}
    	return useable;
    }
    bool dfs(int cur,int ans)
    {
    	if(cur==4&&ans==23)return 1;
    	for(int i=0;i<5;i++)
    		if(!vis[i]){
    			vis[i]=1;
    			if(dfs(cur+1,ans+a[i]))return 1;
    			if(dfs(cur+1,ans*a[i]))return 1;
    			if(dfs(cur+1,ans-a[i]))return 1;
    			vis[i]=0;
    		}
    	return 0;
    }
    bool solve()
    {
    	for(int i=0;i<5;i++){
    		memset(vis,0,sizeof(vis));
    		vis[i]=1;
    		if(dfs(0,a[i]))return 1;
    		vis[i]=0;
    	}
    	return 0;
    }
    int main()
    {
    	while(read()){
    		if(solve())puts("Possible");
    		else puts("Impossible");
    	}
    	return 0;
    }


  • 相关阅读:
    ecos启动流程分析
    ecos中断机制分析(2)
    Redboot修改实例
    6/6 项目开工
    6/8 可配置工作流 实现思路
    6/7 第2次碰头
    6/10 主要流程和界面讨论会确定
    6/10 设计方案目录草案
    C# 获取某月的第一天和最后一天
    【Manage It】之掌控项目
  • 原文地址:https://www.cnblogs.com/keshuqi/p/5957723.html
Copyright © 2020-2023  润新知