动态规划:硬币变化
dynamic programming: coin change
我有一个输入:
- 测试用例的数量
- 一笔钱
作为输出,我需要:
- 我们拥有的不同硬币的数量以及每个硬币的价值。
程序应确定是否存在解决方案,因此输出应为"是"或"否"。
我使用动态编程编写了程序,但它仅在我一次输入一个测试用例时才有效 如果我一次编写 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
,那么整个循环将中断,而您只需要跳过此硬币。
附言请为正确的代码格式而烦恼。
相关文章:
- 最小硬币更换问题(自上而下方法)
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 如何在硬币兑换问题中找到硬币的数量
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 硬币兑换:找到多种方法来重现给定的总和
- 如何在 c++ 中循环中使用频率变化的声音?
- 为什么 C++ 中的零会发生变化
- 我如何计算硬币变化中的不同组合
- 动态规划:硬币变化
- 硬币的变化(硬币的价值是m的幂)
- 是硬币变化算法,输出仍可由DP解决的所有组合
- 自底向上的方法,以最小的硬币数量的变化
- 硬币变化自下而上的动态规划
- 寻找多种方法来在硬币变化中赚取总和