程序的思想是:輸入數據是,先使用快排對其從大到小進行排序,然后記錄相同數據的個數,比如4 3 3 2 2 1 1,最后的數據變成4 3 2 1 ,并且同時數據的個數f[]變成1 2 2 2
然后就是遍歷,相同的數據如果不能得到最后的結果,下一次就不會遍歷。
?
//剪枝有這幾個
首先:從大到小排序,剪枝1
再者:如果當前的sum比要遍歷的數據小,則跳過這個數據
?
利用一個vector來記錄結果
?
#include <iostream>
//#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
/*0MS 344K*/
//function
int cmp(const void *a,const void *b);
void dfs(int index,int sum);
//var
int a[13]; //輸入數據
int b[13]; //記錄從大到小的數據,相同數據個數記錄在f[]中
int l; //b[]數據的長度
int f[13]; //記錄當前數據b[]的個數
vector<int> c; //結果
bool flag;
//fstream fin;
int main()
{
//fin.open("1258.txt",ios::in);
int t,n;
while(cin>>t>>n&&n!=0)
{
flag=false;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
memset(f,0,sizeof(f));
qsort(a,n,sizeof(a[0]),cmp);
//把相同的數據合并在一起
int cur=a[0]; //當前數據是多少
int j=0;
b[j]=cur;
for(int i=0;i<n;i++)
{
if(a[i]==cur)
f[j]++;
else
{
cur=a[i];
b[++j]=cur;
i--;
}
}
l=++j;
cout<<"Sums of "<<t<<":"<<endl;
dfs(0,t);
if(!flag)
cout<<"NONE"<<endl;
}
system("pause");
return 0;
}
void dfs(int index,int sum)
{
if(sum==0)
{
flag=true;
int length=c.size();
for(int i=0;i<length-1;i++)
cout<<c[i]<<"+";
cout<<c[length-1]<<endl;
}
else
{
for(int i=index;i<l;i++)
{
if(b[i]>sum) continue;//剪枝
else
{
c.push_back(b[i]);
f[i]--;
if(f[i]==0)
dfs(i+1,sum-b[i]);
else if(f[i]>0)
dfs(i,sum-b[i]);
f[i]++;
c.pop_back();
}
}
}
}
int cmp(const void *a,const void *b)
{
return ((*(int *)b)-(*(int *)a));
}
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

