我正在尝试使用递归来查找给定金额的最小金额。我的代码能够列出所需的最小硬币数量,但我似乎无法找到打印出哪些硬币用于提出解决方案的方法。我搜索并找到了类似的例子,但我似乎无法正确地应用它。
这是我到目前为止所做的:
Please enter an integer amount.
17
The minimum number of coins to make 17 in United States currency is 4.
The coins used were:
到目前为止运行的代码示例:
- (void)collectionView:(UICollectionView *)collectionView didUpdateFocusInContext:(UICollectionViewFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator{
UICollectionViewCell *nextFocusedCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"VideoCell" forIndexPath:context.nextFocusedIndexPath];
UICollectionViewCell *previousFocusedCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"VideoCell" forIndexPath:context.previouslyFocusedIndexPath];
if (context.nextFocusedView) {
[coordinator addCoordinatedAnimations:^{
[nextFocusedCell setFrame: CGRectMake(3, 14, 300, 300)];
} completion:^{
// completion
}];
} else if (context.previouslyFocusedView) {
[coordinator addCoordinatedAnimations:^{
[previousFocusedCell setFrame: CGRectMake(3, 14, 100, 100)];
} completion:^{
// completion
}];
}
如果有人能给我一些关于如何做到这一点的见解,那将非常感激。
答案 0 :(得分:2)
我认为这应该与您想要实现的目标完全一致。只需拨打[{"seri": "Naruto",
"randomword": [{
"klasor": "138",
"yol": [
]
},
{
"klasor": "300",
"yol": [
]
}
]
},
{
"seri": "One Piece",
"randomword": [
{
"klasor": "137",
"yol": [
]
}
]
}
])
和,它就会输出最小数量的硬币和所有特定硬币(它将显示其出现次数的次数),使用递归算法。
public static int findMinCoins(arg1, arg2)
答案 1 :(得分:0)
在这里,你有一个测试,功能如下。请注意,不处理边缘情况,例如空货币或负数。
假设货币数组已排序。如果没有,请使用Arrays.sort(currency)
对其进行排序。
public class FindMinimumCoinsTest {
@Test
public void test() throws Exception {
int[] USA = { 1, 5, 10, 25, 50 };
assertEquals(2, findMinCoins(USA, 11));
assertEquals(4, findMinCoins(USA, 8));
assertEquals(4, findMinCoins(USA, 111));
assertEquals(3, findMinCoins(USA, 27));
}
public static int findMinCoins(int[] currency, int amount) {
int coins = 0;
int sum = 0;
int value, n;
for (int i = currency.length - 1; i >= 0; i--) {
value = currency[i];
n = (amount - sum) / value;
if (n > 0) {
coins += n;
sum += n * value;
}
}
return coins;
}
}
此外,不需要使用此方法进行递归;)
答案 2 :(得分:0)
这是一个递归代码(工作,但需要修复......)。 我的想法是传递和数组所有硬币{1,5,10,25,50}并递归调用从左到右(直到数组结束)
注意:
输出中有一个小错误
数字作为1个元素的数组传递,而不是原始int。 (这是为了通过所有递归调用保持其值的引用类型:
public class coins {
public static void main(String[] args) {
// arrays of coin types
int[] coinTypes = { 0, 1, 5, 10, 25, 50 };
// arrays are references, so changing them
// inside the recursive function will 'really' change
int[] price = {11}; // sample input
tryBigger(price, coinTypes, 0);
}
// tries to see if higher coin is possible by passing array
// of coin types and recursively call until the end of array
public static void tryBigger(int[] price, int[] theCoins, int index) {
if (index < theCoins.length-1){
// until last element
if (price[0] > theCoins[index]){
tryBigger(price, theCoins, ++index);
}
}
// find amount of this coin
int thisCoin = price[0]/theCoins[index];
// remove the amount already got before
price[0] = price[0] - thisCoin*theCoins[index];
System.out.println(thisCoin + " coins of " + theCoins[index]);
return;
}
}
答案 3 :(得分:0)
在您提供的代码中,递归函数返回的数字为Gradle
或1
。保持这种方法,你可以获得硬币列表的一种方法是改变返回变量,包括硬币和计数。
这是一般概念的一个例子;因为我不知道用Java编程,所以我将把实现留给你。
min
答案 4 :(得分:0)
我正在研究类似的东西,这就是我想出的。您可以将使用过的硬币保存在单独的数组中,并使用辅助函数递归打印最后使用的硬币。如果你想返回一个列表或一个字符串,你可以让助手创建并返回一个。
/**
* FIND MINIMAL NUMBER OF COINS TO MAKE CHANGE, WITH CHANGE VALUES: 1, 2, 5, 10, 20, 50, 100, 200
*
* @param change The amount of change we need to give
* @return Minimal amount of coins used
*/
public static int minimalNumberOfCoinsToMakeChange(int change) {
int[] denominations = {1, 2, 5, 10, 20, 50, 100, 200};
int[] dp = new int[change + 1];
int[] origins = new int[change+1];
dp[0] = 0;
for (int i = 1; i <= change; i++) {
dp[i] = Integer.MAX_VALUE;
for (int coin : denominations) {
if (i - coin < 0) {
continue;
}
dp[i] = Math.min(dp[i], 1 + dp[i - coin]);
origins[i] = coin;
}
}
if (dp[change] == Integer.MAX_VALUE) {
return -1;
}
printPath(origins);
return dp[change];
}
/**
* HELPER FUNCTION - GET PATH
*
* @param origins Array with origins from main function
*/
private static void printPath(int[] origins) {
int last = origins[origins.length-1];
System.out.println(last);
origins = Arrays.copyOfRange(origins,0,origins.length-last);
if (origins.length-1 > 0){
printPath(origins);
}
}
我在本例中对面额数组进行了硬编码,但您应该能够删除它并将另一个作为参数传递。这不是最有效的方法,但可能对像我这样刚刚进入动态编程的人有所帮助。干杯!