- 写数游戏
Description
纸上已经有n个数,每次随便取两个,用大的除一下得到结果,如果发现纸上没有,就写到纸上去,直到写不出为止。问纸上最后有几个数?
Sample Input1
2
9 2
Sample Output1
3
开始有 9 和 2,他可以再加上4,因为 9 div 2 = 4。 在他写完4之后就没什么可写的了,因为9 div 4 = 2,和 4 div 2 = 2。纸上就有 9,2 和 4。
Sample Input2
6
1 5 8 30 15 4
Sample Output2
11
数据范围
n <= 100
每个数 x_i <= 100
代码如下:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int division(int a,int b)
{
return (a>b)?(a/b):(b/a);
}
int main()
{
int N;
cin>>N;
int data[101];
int flag[101];//bag
memset(flag, 0, sizeof(flag));//make every element of flag false to initialize the array
for(int i=0;i<N;i++)
{
cin>>data[i];
flag[data[i]]=1;
}
queue<int> q;
int tmp;
for(int i=0;i<N;i++)
for(int j=i+1;j<N;j++)
{
tmp=division(data[i], data[j]);
if(flag[tmp]==0)
q.push(tmp);
}
while(!q.empty())
{
if(flag[q.front()]==0)
{
for(int i=0;i<N;i++)
{
tmp=division(data[i], q.front());
if(flag[tmp]==0)
q.push(tmp);
}
flag[q.front()]=1;
data[N++]=q.front();
q.pop();
}
else q.pop();
}
cout<<N;
return 0;
}
总结:
背包问题会有两个基本的数组,一个用来储存这个数据是否存在,比如上面的flag[ ],他可以是bool型数组也可以是int型数组,元素的地址(即它是第几个元素代表他的权值,他的值0/1代表它是否存在与背包当中)。另一个用来顺序存储所有的权值,如上面的data[ ],他从第一个数据顺序存储到最后一个,用来存储在背包中已经存在的数据。