安奴是一个特别精于数字游戏的小女孩,如果给她一组可以重复的正整数,通过这组数的加、减或保留的任意组合运算(每次计算时每个数只参加一次或不参加),她可以立即计算出所有可能的互不相同正整数的个数。
例如,如果给她三个整数:2、8、3,她将立即告诉你可以产生11个不同的正整数,即:1、2、3、5、6、7、8、9、10、11及13。
输入(请使用标准输入输出,而不要读写文件)
Ø 输入可以包含多个测试用例
Ø 每个用例的第一行给出两个整数:用例号c与给安奴的正整数个数k(k<15);
Ø 每个用例的第二行给出k个以一个空格分隔的任意排序的整数
Ø 用例号c为0时表示输入结束
输出(请使用标准输入输出,而不要读写文件)
每个测试用例输出一行:用例号c、可以产生的正整数个数,中间用一个空格分隔。
案例号 | 输入举例 | 输出举例 |
1 | 1 2 2 3 | 1 4 |
2 | 2 3 2 3 8 | 2 11 |
3 | 3 4 2 5 5 4 | 3 14
|
4 | 0 |
|
解法1:
#include <iostream>
#include <set>
#include <vector>
using namespace std;
void main()
{
long a[15];
do
{
int c, n;
cin >> c;
if (c == 0)
break;
cin >> n;
if (n > 15)
break;
for (int i=0; i<n; i++)
cin >> a[i];
vector<long> sum;
sum.push_back( 0 );
for (int j=0; j<n; j++)
{
//将vector中的数与当前数进行相加和相减运算,然后压入vector
int iSize = sum.size();
for ( int k =0 ; k < iSize ; k++ )
{
sum.push_back( sum.at(k) + a[j] );
sum.push_back( sum.at(k) - a[j] );
}
}
set<long> s;
int iCount = sum.size();
for ( int l =0 ; l < iCount ; l++ )
{
//将vector中的正数插入set
if ( sum.at(l) >0 )
{
s.insert( s.begin(), sum.at(l) );
}
}
cout<<c<<" "<<s.size()<<endl;
}while (true);
}
解法2:当年一个朋友写的
#include <iostream>
#include <set>
#include <iomanip>
#include <algorithm>
using namespace std;
class St
{
public:
enum { MAX_SIZE = 20 };
St(int [], int );
int GetAn();
private:
bool inc();
int getsum();
int c[MAX_SIZE];
int f[MAX_SIZE];
int count;
set<int> s;
};
int main()
{
int a[St::MAX_SIZE];
int i = 1;
do
{
int c, n;
cout << i << " >";
cin >> c;
if (c == 0)
break;
cin >> n;
if (n > St::MAX_SIZE)
break;
cout << ">";
for (int j=0; j<n; j++)
cin >> a[j];
St s(a, n);
cout << i << "=>" << s.GetAn() << endl << endl;
i++;
}while (true);
return 0;
}
St::St(int a[], int n)
{
if (n > MAX_SIZE)
{
cout << "输入的数字个数太多/n";
}
else
{
for (int i=0; i<n; i++)
{
f[i] = 0;
c[i] = a[i];
}
count = n;
}
}
int St::getsum()
{
int sum;
int i = 0;
while (f[i] == 2)
i++;
sum = c[i];
if (i == count)
sum = 0;
i++;
while (i < count)
{
if (f[i] == 0)
sum += c[i];
else if (f[i] == 1)
sum -= c[i];
i++;
}
return sum;
}
bool St::inc()
{
int i = 0;
f[i]++;
while (f[i] >= 3)
{
f[i+1]++;
f[i] = f[i]-3;
i++;
}
if (i == count)
return false;
return true;
}
int St::GetAn()
{
int w;
do
{
w = getsum();
if (w < 0)
w = -1*w;
if (w != 0)
s.insert( s.begin(), w );
}while ( inc() );
return s.size();
}