主要使用了暴力匹配的方法:
#include<iostream>
#include<map>
using namespace std;
int main()
{
int val;
int count=0;
int i=0;
int flag[50];
int sum;
cin>>sum;
multimap<int,int>mi;
while (cin>>val)
{
count++;
mi.insert(make_pair(val,i));
flag[i]=0;
i++;
}
int re=0;
multimap<int,int>::iterator it1=mi.begin(),it2=mi.begin();
int j=0;
while (it1!=mi.end())
{
re+=it1->first;
if (re==sum)
{
j++;//相等時爲後面的移動坐鋪墊
int k=0;
while (k!=(j-1))
{
it2++;
k++;
}
while (it2!=it1)
{
flag[it2->second]=1;//試滿足條件的下標表示爲1
it2++;
}
flag[it2->second]=1;
it2=mi.begin();
k=0;
it1=it2;
while (k!=(j-1))
{
it1++;//使it1遞增到下一個位置,類似雙重循環的效果 i=0;i<n;i++;j=i;j<n;j++;
k++;
}
re=0;
}
else
{
if (re>sum)
{
j++;
int k=0;
it1=mi.begin();
while (k!=(j-1))
{
it1++;
k++;
}
re=0;
}
}
it1++;
}
for (j=0;j<count;j++)
{
cout<<flag[j]<<" ";
}
cout<<endl;
}
////////////////////////////////////////////
//先排序,從兩頭同時找,大於的時候後面前移,小於的時候前面後移,前移的時候要減去前移前的值
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int value;
vector<int>vi;
for (int count=1;count<10;count++)
{
vi.push_back(count);
}
sort(vi.begin(),vi.end());
int rsum=10;
int len=vi.size();
int j=len-1;
int i=0;
int sum=0;
for (int i1 = 0; i1 < len; ++i1)
{ j=len-1;
sum=vi[i1]+vi[j];
for (i=i1; i<j; )
{
if (sum>rsum)
{
sum=sum-vi[j];
j--;
sum=sum+vi[j];
continue;
}
if (sum<rsum)
{
++i;
sum=sum+vi[i];
continue;
}
if (sum==rsum)
{
for (int k = i1; k <=i;k++)
{
cout<<vi[k];
}
cout<<vi[j]<<endl;
sum=sum-vi[j];
j--;
sum=sum+vi[j];
continue;
}
}
}
}