Objective c 例如,如果coins=[1,2,5]和N=11,则返回true;如果coins=[3,77]和N=100,则返回true
在线等待~Objective c 例如,如果coins=[1,2,5]和N=11,则返回true;如果coins=[3,77]和N=100,则返回true,objective-c,Objective C,在线等待~ 给定不同面额的硬币数量,例如[1,2,5],并测试它们是否可用于构成一定数量(N),假设您可以在每个面额中使用无限数量的硬币。例如,如果coins=[1,2,5]和N=11,如果coins=[3,77]和N=100,则返回true,返回方法是使用递归函数(在这里,它将使用第一个硬币与其他硬币数组进行计算,然后递归地减小硬币数组的大小) 但是我不熟悉Objective-C,所以我用C写了一个。使用时应将其转换为Objective-C bool CanDo(int n, int [] a
给定不同面额的硬币数量,例如[1,2,5],并测试它们是否可用于构成一定数量(N),假设您可以在每个面额中使用无限数量的硬币。例如,如果coins=[1,2,5]和N=11,如果coins=[3,77]和N=100,则返回true,返回方法是使用递归函数(在这里,它将使用第一个硬币与其他硬币数组进行计算,然后递归地减小硬币数组的大小) 但是我不熟悉Objective-C,所以我用C写了一个。使用时应将其转换为Objective-C
bool CanDo(int n, int [] arr)
{
if (arr.Length == 1)
{
if (n % arr[0] == 0)
{
return true;
}
}
else
{
var ls = new List<int>(arr);
ls.RemoveAt(0);
int [] newarr = ls.ToArray(); //Create New array by deleting first element(current calculated element) of old array
for(int i = 0; i <= n/arr[0]; i++)
{
int next_n = n - i * arr[0];
if (next_n == 0)
{
return true;
}
else if (next_n < 0)
{
break;
}
else if(next_n > 0)
{
if( CanDo(next_n, newarr) )
{
return true;
}
}
}
}
return false;
}
boolcando(int n,int[]arr)
{
如果(arr.Length==1)
{
如果(n%arr[0]==0)
{
返回true;
}
}
其他的
{
var ls=新列表(arr);
ls.RemoveAt(0);
int[]newarr=ls.ToArray();//通过删除旧数组的第一个元素(当前计算元素)创建新数组
对于(int i=0;i 0)
{
如果(坎多(下一个,纽瓦尔))
{
返回true;
}
}
}
}
返回false;
}
这是C#中的完整代码,可以打印到控制台中找到第一个解决方案
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static List<string> resultString = new List<string>();
static bool CanDo(int n, int [] arr)
{
if (arr.Length == 1)
{
if (n % arr[0] == 0)
{
resultString.Add(n/ arr[0] + "*" + arr[0]);
return true;
}
}
else
{
var ls = new List<int>(arr);
ls.RemoveAt(0);
int [] newarr = ls.ToArray(); //Create New array by deleting first element of old array
for(int i = 0; i <= n/arr[0]; i++)
{
if (resultString.Count > 0)
{
resultString.RemoveAt(resultString.Count - 1);
}
int next_n = n - i * arr[0];
if (next_n == 0)
{
resultString.Add(i + "*" + arr[0]);
return true;
}
else if (next_n < 0)
{
break;
}
else if(next_n > 0)
{
if (i != 0)
{
resultString.Add(i + "*" + arr[0] + " + ");
}
if( CanDo(next_n, newarr) )
{
return true;
}
}
}
}
return false;
}
static void Main(string[] args)
{
try
{
int[] arr = { 3, 5, 7 };
int N = 20;
resultString = new List<string>();
if (CanDo(N, arr))
{
resultString.ForEach(Console.WriteLine);
Console.Read();
}
else
{
Console.Write("Can't do");
Console.Read();
}
}
catch (Exception ex)
{
//handle exception
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序1
{
班级计划
{
静态列表结果字符串=新列表();
静态布尔坎多(整数n,整数[]arr)
{
如果(arr.Length==1)
{
如果(n%arr[0]==0)
{
结果字符串添加(n/arr[0]+“*”+arr[0]);
返回true;
}
}
其他的
{
var ls=新列表(arr);
ls.RemoveAt(0);
int[]newarr=ls.ToArray();//通过删除旧数组的第一个元素来创建新数组
对于(int i=0;i 0)
{
resultString.RemoveAt(resultString.Count-1);
}
int next_n=n-i*arr[0];
if(next_n==0)
{
结果字符串Add(i+“*”+arr[0]);
返回true;
}
否则如果(下一个<0)
{
打破
}
else if(下一步>0)
{
如果(i!=0)
{
结果字符串.Add(i+“*”+arr[0]+“+”);
}
如果(坎多(下一个,纽瓦尔))
{
返回true;
}
}
}
}
返回false;
}
静态void Main(字符串[]参数)
{
尝试
{
int[]arr={3,5,7};
int N=20;
resultString=新列表();
如果(坎多(北,arr))
{
结果字符串ForEach(控制台WriteLine);
Console.Read();
}
其他的
{
控制台。写(“不能做”);
Console.Read();
}
}
捕获(例外情况除外)
{
//处理异常
}
}
}
}