我有一个输入:
作为输出我需要:
程序应确定是否有解决方案,因此输出应为“是”或“否”。
我使用动态编程编写程序,但它只在我一次输入一个测试用例时才有效如果我写一次让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;
}
答案 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。请使用正确的代码格式来打扰自己。