给我一组1-360之间的数字。还给了另一个数字n。我必须告诉我是否可以通过上面的数字列表生成给定的数字n。我可以对给定的数字进行以下操作
现在的目标是检测我是否可以生成数字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;
}
答案 0 :(得分:0)
这是一个天真的算法,可以解决(我认为)这个问题,但可能不是最有效的算法。
问题设置:
输入:
输出:
基本上,您希望使用 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