Если задано значение N, если мы хотим внести сдачу на N центов и у нас есть бесконечный запас каждой из монет номиналом S = {S1, S2, .. , Sm}, сколькими способами мы можем внести сдачу? Порядок монет значения не имеет. Например, для N = 4 и S = {1,2,3} имеется четыре решения: {1,1,1,1},{1,1,2},{2,2},{1, 3}. Таким образом, на выходе должно быть 4. Для N = 10 и S = {2, 5, 3, 6} есть пять решений: {2,2,2,2,2}, {2,2,3,3}, {2,2,6}, {2,3,5} и {5,5}. Таким образом, на выходе должно быть 5.
Ссылка на вопрос: https://www.geeksforgeeks.org/coin-change-dp-7/
Я наткнулся на все решения.
Я использовал матричный метод, чтобы найти решение для этого:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
#include <climits>
#include <map>
#include <set>
#include <queue>
#include <unordered_map>
#define ll long long
//Author: Nilargha Roy (neel13)
using namespace std;
int coinchangeways(int arr[],int n,int sum)
{
int dp[n+1][sum+1];
memset(dp,-1,sizeof(dp));
for(int j=1;j<n;j++)
{
dp[0][j]=0;
}
for(int i=0;i<n;i++)
{
dp[i][0]=1;
}
for(int i=1;i<n+1;i++)
{
for(int j=1;j<sum+1;j++)
{
if(arr[i-1] <= j)
dp[i][j]=dp[i][j-arr[i-1]] + dp[i-1][j];
else
dp[i][j]=dp[i-1][j];
}
}
return dp[n][sum];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
#ifdef __APPLE__
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int n;
cin>>n;
int arr[n];
for(int i=0;i<n;i++)
cin>>arr[i];
int sum; cin>>sum;
cout<<coinchangeways(arr,n,sum);
}
Однако, когда я ввожу массив = {1,2,3} и SUM = 5 в качестве входных данных, вывод должен быть: 5, а я получаю 1. Может ли кто-нибудь определить логическую ошибку в моем коде?