我遇到了求和問題的遞歸求解問題。問題是: 對於一個給定的m和n做一個程序,將n個數字總和爲m,以便使用最小數字,它們是.Id有多種解決方案,正確的一個使用更大的數字。用戶輸入n,m和n數字。例如:m = 19 n = 4 8,5,4,1。解決方案是8 + 5 + 5 + 1。如果我用數組中的下一個數字調用該函數,並在小於sum時添加它,只有在數組中的下一個數字總和爲m時纔會找到解決方案。如果問題是這樣的:m = 28 n = 3 8,7,5解決方案是8 + 8 + 7 + 5,但我的程序會去8 + 8 + 8並嘗試添加7或5,並會因爲無他們可以適應多達28個。所以我的問題在這裏有兩個以上的步驟。我可以從8 + 8 + 8 + 7到8 + 8 + 8,但可以回到8 + 8。這與揹包問題相似,只是它更簡單。 對不起,不包括到目前爲止我的代碼:遞歸最大數目求和
#include <iostream>
#include <vector>
using namespace std;
void outputt(vector<int>);
int x(int m,vector<int> s,int n,int u)
{
static int sum=0;
static int level=0;
static vector<int> p;
sum+=s[u];
p.push_back(s[u]);
if(level==((n-u)+1))
{
p.pop_back();
level=0;
x(m,s,n,u-1);
}
if(sum>m)
{
level++;
sum-=s[u];
p.pop_back();
x(m,s,n,u+1);
}
if(sum==m)
{
outputt(p);
return sum;
}
else
x(m,s,n,u);
level++;
if(level>n-1)
outputt(p);
if(sum==m)
return sum;
else
{
cout<<"....";
x(m,s,n,level);
}
}
void outputt(vector<int> x)
{
for(vector<int>::iterator i=x.begin();i!=x.end();++i)
cout<<*i<<" ";
}
int main()
{
int m,n;
cin>>m>>n;
int z;
vector<int> p;
for(int i=0;i<n;++i)
{
cin>>z;
p.push_back(z);
}
cout<<x(m,p,n,0);
system("PAUSE");
}
沒有與輸出一個問題,但現在不是很重要。
我們可以看到你的代碼到目前爲止嗎? – 2012-03-09 10:39:18
我認爲你的問題陳述不是你的意思:「製作一個程序,將n個數字總和爲m,以便使用最小數字」你的意思是:「從一組n個數字中抽取加數,最多爲m,加數最少「 – 2012-03-09 11:09:50
男人,這是爲IOCCC實際打算的作業嗎?當他們真正閱讀你的代碼(和問題)時,人們更可能幫助你。 – 2012-03-09 12:04:55