动态规划:硬币变化

dynamic programming: coin change

本文关键字:变化 硬币 动态规划      更新时间:2023-10-16

我有一个输入:

  1. 测试用例的数量
  2. 一笔钱

作为输出,我需要:

  1. 我们拥有的不同硬币的数量以及每个硬币的价值。

程序应确定是否存在解决方案,因此输出应为"是"或"否"。

使用动态编程编写了程序,但它仅在我一次输入一个测试用例时才有效 如果我一次编写 200 个测试用例,输出并不总是正确的。

我假设我在测试用例之间错误保存状态时遇到问题。我的问题是,我该如何解决这个问题?我只是在征求一些建议。

这是我的代码:

#include<iostream>
#include<stdio.h>
#include<string>
#define max_muenzwert 1000
  using namespace std;

  int coin[10];//max. 10 coins
  int d[max_muenzwert][10];//max value of a coin und max. number of coins
  int tabelle(int s,int k)//computes table
  {   
    if(d[s][k]!=-1) return d[s][k];
    d[s][k]=0; 
    for(int i=k;i<=9&&s>=coin[i];i++)
      d[s][k]+=tabelle(s-coin[i],i);

    return d[s][k];
 }
 int main()
 {
    int t;
    for(cin>>t;t>0;t--)//number of testcases
     {        
                int n;   //value we are searching   
           scanf("%d",&n)==1;             
          int n1;              
    cin>>n1;//how many coins
    for (int n2=0; n2<n1; n2++)
    {
        cin>>coin[n2];//value of coins
        }
    memset(d,-1,sizeof(d));//set table to -1
    for(int i=0;i<=9;i++)
    {
             d[0][i]=1;//set only first row to 1 
             }
      if(tabelle(n,0)>0) //if there's a solution
      {
                    cout<<"yes"<<endl;
                    }
      else //no solution
      {
           cout<<"no"<<endl;
      }


      }
      //system("pause");
return 0;
}

如您所见,您有可变数量的硬币,您可以使用以下行进行输入:cin>>n1;//how many coins 。但是在tabelle方法中,您总是循环遍历0 - 9,这是错误的。您应该只循环0 - n1 .试试这个测试用例:

21022 51019

对于第二个测试集,你的答案应该是no但你的程序会说yes,因为它会在硬币数组的第二个元素中找到 5。

for(int i=k;i<=9&&s>=coin[i];i++)
  d[s][k]+=tabelle(s-coin[i],i);

在这里,如果coin[i] < s,那么整个循环将中断,而您只需要跳过此硬币。

附言请为正确的代码格式而烦恼。