每日刷题03

问题描述
  逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中。不过他想到了一个游戏来使他更无聊。他拿出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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值