问题描述
逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中。不过他想到了一个游戏来使他更无聊。他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的情况下长度最长是多少。
输入格式
第一行一个数n,表示n个棍子。第二行n个数,每个数表示一根棍子的长度。
输出格式
一个数,最大的长度。
样例输入
4
1 2 3 1
样例输出
3
数据规模和约定
n<=15
解答:
这道题在参考了网上的解法之后,这里主要讲利用二进制数这个方法来进行木棍选择,我们知道二进制数只有0,1.这里我们就可以用01来表示当前的木棍选择0表示不选择1表示选择,这里我们就拿n=4,来进行举例,当n=4时候用四位二进制数来表示,0000,0001,0010等那么这里就有16种选择木棍的方法,然后我们统计每种选法的长度最后比较两个选法若是最长则可以输出,这里也就需要补集,比如说我选择了0001,也就是指选择第一个木棍那么1111-0001 = 1110,还有234木棍没有选,在234中我再去选择能够满足这个题目的目棍,具体代码如下:
#include
#include
#include<math.h>
#define N 70000
int arr[N]={0},b[N]={0};
using namespace std;
int main(){
int n,temp,maxs=0;
cin>>n;//用来看看有多少根木棍
for(int i = 0;i<n;i++)
cin>>b[i];
for(int i = 0;i<(1<<n);i++)
{
for(int j = 0;j<n;j++){
if(i&(1<<j)){//这里1<<j主要为了标记当前选择i是否有第j根棍子 j=1表示第二根棍子,如果有就在这个选择上把j棍子长度加上:
arr[i]+=b[j];
}
}
}
for(int i = 0;i<(1<<n);i++){
temp = (1<<n)-(1+i);//上面对应选法所剩下的木棍
for(int j = temp;j;j=(j-1)&temp){//从最大值开始也就是最大选法开始减少去与arr里面选法进行比较。
if(arr[i]==arr[j]){
maxs = max(maxs,arr[i]);
}
}
}
cout<<maxs;
}