如何检查是否从给定数字生成数字

时间:2014-03-25 02:51:25

标签: algorithm

给我一​​组1-360之间的数字。还给了另一个数字n。我必须告诉我是否可以通过上面的数字列表生成给定的数字n。我可以对给定的数字进行以下操作

  1. (a + b)mod 360
  2. (a-b)mod 360其中a> b
  3. 我可以在任意时间内取一个数字(即使在a + b,a = b)
  4. 现在的目标是检测我是否可以生成数字n

    示例假设n为60且给定的数字列表仅为100(但可能更多),因此我可以通过添加100十五次来生成60,然后采用等于60的mod360。

    以下是我尝试的解决方案

    #include<stdio.h>
    int ispossible=0;
    void AnglePossible(int a1[],int angle,int currentangle,int n)
    {
        int i;
        if(angle==(currentangle%360))
            ispossible = 1;
        else if((currentangle!=0)&&(currentangle%360==0))
            return;
        for(int i=0;i<n;i++)
        {
            AnglePossible(a1,angle,currentangle+a1[i],n);
        }
    }
    
    int main()
    {
        int n,k;
        int a1[361],a2[361];
        int i,j;
        int result;
        scanf("%d%d",&n,&k);
        for(i=0;i<n;i++)
            scanf("%d",&a1[i]);
        for(i=0;i<k;i++)
            scanf("%d",&a2[i]);
    
        for(i=0;i<k;i++)
        {
            ispossible=0;
            AnglePossible(a1,a2[i],0,n);
            if(ispossible==1)
            printf("YES\n");
            else
            printf("NO\n");
        }
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

这是一个天真的算法,可以解决(我认为)这个问题,但可能不是最有效的算法。

问题设置:

输入:

  1. nums (数字。一组整数)
  2. 目标(目标)
  3. 输出:

    • bool表示目标是否可以访问

    基本上,您希望使用 nums 进入目标。您的起点在数字行上 0 (您始终可以 0 )。

    因此,您可以跟踪可以到达的位置(数组初始化为[0])。对于 nums 中的每个号码,您可以使用此新号码更新可以获得的位置。由于加法和减法是可交换的,因此顺序并不重要。

    这是一个显示这个想法的小型python程序:

    def reachable(i, start = 0): 
      cantReach = range(360)
      canReach = set()
      reach = start
      while reach in cantReach:
        cantReach.remove(reach)
        canReach.add(reach)
        reach += i
        reach = reach % 360 
      return canReach
    
    def main(nums, target):
      canReach = set([0])
      for i in nums:
        for j in canReach:
          canReach = canReach.union(reachable(i, j)) 
    
      canReach = sorted(list(canReach))
      print "can reach:", canReach
      print "result:", target in canReach
    
    
    main([100],60)
    

    输出结果为:

    can reach: [0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300, 320, 340]
    result: True