?? 郵票問(wèn)題的一部份(編得一團(tuán)糟).txt
字號(hào):
/郵票問(wèn)題的一小部分,but i have messed it up。要重新編寫(xiě)過(guò)!
#include<iostream>
#include<cstdlib>
#include<vector>
using namespace std;
int kindNum = 4;
vector<int> moneyPaper(100); //0號(hào)下標(biāo)未用
int maxPermission = 5;
vector<int> x(100); //存放答案序列(存的是moneyPaper的下標(biāo)而不是面值),最多由kindNum個(gè)元素組成
bool NextValueByRule( int &currSum,int sum,int k)
{
//注意,在要引起回溯的時(shí)候,要把x[k]重新設(shè)置為0
int i;
if( k == maxPermission)
{
for( i = 1; i <= kindNum;i++)
{
if(currSum + moneyPaper.at(i) == sum)
{
x[k] = i;
currSum = sum;
return 1; //答案已經(jīng)找到。
}
}
x[maxPermission]=0;
return 0; //需要回溯
}
else
{
x[k] = div(x[k]+1,kindNum+1).rem;
if( x[k]==0) //需要回溯
{
currSum -= moneyPaper.at(kindNum);
return 0;
}
else
{
currSum += moneyPaper.at(x[k]);
currSum -= moneyPaper.at(x[k]-1);
if( currSum > sum)
{
currSum -= moneyPaper.at(x[k]);
x[k] = 0;
return 0;
}
return 1;
}
}
}
void OutPut( int k)
{
int i;
cout<<"--------------------------"<<endl;
for( i = 1 ; i <= k; i++ )
{
cout<<" "<< moneyPaper.at(x[i]);
}
cout<<endl;
}
void StampCombination()
{
//郵票問(wèn)題,有kindNum種面值的鈔票,最多允許5張,問(wèn)能否組合成money。
int sum = 64;
int currSum = 0;
int k = 1;
int num =1;
while( k > 0) //當(dāng)k = 0 時(shí)結(jié)束算法
{
if(NextValueByRule(currSum,sum,k))//如果第k個(gè)數(shù)據(jù)存在有效的值
{
if( currSum == sum) //這個(gè)算法只能求出一個(gè)解。
{
OutPut(k);
break;
}
else
k++;
}
else
{
k--;
}
}//while
}
void main()
{
moneyPaper.at(1) = 1;
moneyPaper.at(2) = 4;
moneyPaper.at(3) = 12;
moneyPaper.at(4) = 21;
StampCombination();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -