动态编程:硬币改变

时间:2012-04-10 15:32:49

标签: c++ coin-change

我有一个输入:

  1. 测试用例的数量
  2. 一笔钱
  3. 作为输出我需要:

    1. 我们拥有的不同硬币数量和每枚硬币的价值。
    2. 程序应确定是否有解决方案,因此输出应为“是”或“否”。

      我使用动态编程编写程序,但它只在我一次输入一个测试用例时才有效如果我写一次让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;
      }
      

2 个答案:

答案 0 :(得分:1)

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

2
10
2
2 5

10
1
9

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

答案 1 :(得分:0)

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

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

P.S。请使用正确的代码格式来打扰自己。