C++ 动态规划:硬币兑换
我的意见是:C++ 动态规划:硬币兑换,c++,coin-change,C++,Coin Change,我的意见是: 测试用例的数量 一笔钱 作为输出,我需要: 我们拥有的不同硬币的数量和每枚硬币的价值 程序应确定是否存在解决方案,因此输出应为“是”或“否” 我使用动态编程编写了这个程序,但它只在每次输入一个测试用例时起作用。如果我一次编写200个测试用例,那么输出并不总是正确的 我假设在测试用例之间存在错误保存状态的问题。 我的问题是,我如何解决这个问题?我只是想征求一些意见 这是我的密码: #include<iostream> #include<stdio.h> #in
#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;
}
#包括
#包括
#包括
#定义最大值为1000
使用名称空间std;
国际货币[10]//最多10枚硬币
国际数据[max_muenzwert][10]//硬币的最大价值和硬币的最大数量
int tabelle(ints,intk)//计算表
{
如果(d[s][k]!=-1)返回d[s][k];
d[s][k]=0;
for(inti=k;i=coin[i];i++)
d[s][k]+=tabelle(s-coin[i],i);
返回d[s][k];
}
int main()
{
int t;
for(cin>>t;t>0;t--)//测试用例数
{
int n;//我们正在搜索的值
scanf(“%d”,&n)==1;
int-n1;
cin>>n1;//多少硬币
对于(int n2=0;n2>硬币[n2];//硬币的价值
}
memset(d,-1,sizeof(d));//将表设置为-1
for(int i=0;i0)//如果有解决方案
{
coutfor(int i=k;i=coin[i];i++)
d[s][k]+=tabelle(s-coin[i],i);
在这里,如果coin[i]
,则整个循环将中断,而您只需跳过此硬币
另外,请注意正确的代码格式。for(inti=k;i=coin[i];i++)
d[s][k]+=tabelle(s-coin[i],i);
在这里,如果coin[i]
,则整个循环将中断,而您只需跳过此硬币
请注意,请注意正确的代码格式。正如您看到的,您有不同数量的硬币,您正在使用这一行输入:cin>>n1;//有多少硬币
。但是在选项卡
方法中,您总是循环通过0-9
,这是错误的。您应该只循环通过0-n1
。请尝试此测试用例:
2
10
2
2 5
10
1
9
2.
10
2.
2 5
10
1.
9
对于第二个测试集,您的答案应该是否
,但您的程序会说是
,因为它会在硬币数组的第二个元素中找到5。正如您所看到的,您有不同数量的硬币,您正在使用以下行进行输入:cin>>n1;//有多少硬币
。但是在选项卡
方法中总是循环通过0-9
,这是错误的。您应该只循环通过0-n1
。尝试此测试用例:
2
10
2
2 5
10
1
9
2.
10
2.
2 5
10
1.
9
对于第二个测试集,您的答案应该是no
,但您的程序会说yes
,因为它会在硬币数组的第二个元素中找到5。测试用例是否可能一起运行?例如,您的scanf(“%d”,…)
将获取第一个连续的十进制数字字符串。我讨厌人们问问题,然后就不关心它了!我的回答解决了你的问题吗?:)@sowrov很抱歉没有回答,我找到了另一种方法,我几乎删除了这段代码。但是如果你想查看工作代码,如果你想查看,我可以发布它。谢谢你的帮助测试用例是否可能一起运行?例如,你的scanf(“%d”,…)
将获取第一个连续的十进制数字字符串。我讨厌人们问问题,然后就不关心它了!我的回答解决了你的问题吗?:)@sowrov很抱歉没有回答,我找到了另一种方法,我几乎删除了此代码。但是如果你想查看工作代码,如果想查看,我可以发布它。感谢您的帮助顺便说一句,在同一个项目/源上只能使用scanf或cin,但不能同时使用两者。因为它们不兼容,cin
对象很可能使用缓冲读取,在您需要输入之前读取输入,因此scanf
将无法从输入源读取任何内容。顺便说一句,也可以只使用scanf或者只有cin,但不能同时在同一项目/源上。因为它们不兼容,cin
对象很可能使用缓冲读取,在需要输入之前读取输入,因此scanf
将无法从输入源读取任何内容。