这道题挺有意思的,就是给定一个序列的整数,然后让找出最大的子集,这子集中的任何两个元素能够互相整除(i%j==0或者j%i==0).
思路
子集中两个元素能够保证能够整除,那么如果再加入一个整数,判断的条件就是这个整数能够整除子集中最小的数或在能够被其中最大的数整除,当然,这个说法仅仅是针对题目解答的一个途径。
我们将序列排序,然后使用动态规划来求解,如何使用动态规划呢,设
T[n]为第n个整数为最大时,得到的最大子集的长度。
vector<int> getSubSet(vector<int>& nums){
vector<int> res;
int n=num.size();
int m=INT_MIN,mi=0;
sort(num.begin(),num.end());
vector<int> Ten(n,0);
vector<int> index(n,0);
for(int i=n-1;i>=0;--i){
for(int j=i;j<n;++j){
if(num[j]%num[i]==0&&Ten[i]<1+Ten[j]){
Ten[i]=1+Ten[j];
index[i]=j;
if(Ten[i]>m){
m=Ten[i];
mi=i;
}
}
}
}
for(int i=0;i<m;++i){
res.push_back(num[mi]);
cout<<num[mi]<<" ";
mi=index[mi];
}
cout<<endl;
return res;
}