主要使用了暴力匹配的方法:
#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;
}
}
}
}