我编写了以下代码来实现找零问题:你会得到n种货币面额,它们的价值为v(1) < v(2) < ... < v(n)(所有整数)。假设v(1) = 1,因此您可以始终找零任何金额C。给出一种算法,以尽可能少的硬币找零金额C。
我通过将每个硬币的所有值设置为-1来修改了允许重复的背包问题。然后,程序应返回最大值,使所需硬币(面额)的重量相加等于size变量(所需找零)。我无法确定哪里错了。我应该得到一个-2的答案,意味着我需要两枚硬币,但我得到的答案是-1。 代码:
我通过将每个硬币的所有值设置为-1来修改了允许重复的背包问题。然后,程序应返回最大值,使所需硬币(面额)的重量相加等于size变量(所需找零)。我无法确定哪里错了。我应该得到一个-2的答案,意味着我需要两枚硬币,但我得到的答案是-1。 代码:
#include <stdio.h>
#define max(a,b) (a > b ? a : b)
int matrix[100][100] = {0};
int knapsack(int index, int size, int weights[],int values[]){
int take,dontTake;
take = dontTake = 0;
if (matrix[index][size]!=0)
return matrix[index][size];
if (index==0){
if (weights[0]<=size){
matrix[index][size] = values[0];
return values[0];
}
else{
matrix[index][size] = 0;
return 0;
}
}
if (weights[index]<=size)
take = values[index] + knapsack(index, size-weights[index], weights, values); //knapsack(index) and not //knapsack(index-1)
dontTake = knapsack(index-1, size, weights, values);
matrix[index][size] = max (take, dontTake);
return matrix[index][size];
}
int main(){
int nItems = 4;
int knapsackSize = 10;
int weights[4] = {5,4,6,3};
int values[4] = {-1,-1,-1,-1};
printf("Max value = %dn",knapsack(nItems-1,knapsackSize,weights,values));
return 0;
}
我哪里做错了,该怎么解决?
weights
代表什么,values
又代表什么? - MicroVirus