首页 > 试题广场 >

从1,2,3,......,49,50里选择一个集合S,使得

[单选题]
从1,2,3,......,49,50里选择一个集合S,使得若x属于S,则2x不属于S,则S最多能有____个元素。
  • 25
  • 27
  • 30
  • 33
  • 36
  • 37
这题核心思想是dynamic programming,我写了一个java代码,可以供大家思考

public class Solution {

    public static void main(String[] args){

    int[] res = new int[50];

    //base case

    res[0] = 1;

    res[1] = 1;
     int max = 0;
    for(int i = 2; i <50; i++) {
                //induction rule: when touch even number
                //check the difference at index i/2 and i/2-1
                //and use previous value(at index i-1) minus the difference,
                // which is cost when you chose the value at index i
                // and plus 1, which means you add the current value

    if((i+1)%2==0){

    res[i] = res[i-1]-(res[i/2]-res[i/2-1])+1;

    }

    else{

    res[i] = res[i-1]+1;

    }
                max = Math.max(max,res[i]);

    }

    System.out.println(max);

    }

}


编辑于 2017-04-26 10:06:15 回复(0)
其实取数的话不一定是唯一的。但是数量是一定的
发表于 2016-10-27 15:00:30 回复(0)
1到50去一半,取26到50,共25个,1到25去一半,后者全丢弃,取1到12,共12个,其中(1.2.3.4.5.6)*2=(2.4.6.8.10.12)和后面的进行等销,剩11.9.7,而1-6可删2.3或1.6,剩4个,故:25+3+4=32,但是要求,最多,所以,1.2.4.8和3.6.12需要进行重新处理,即删除2.4.6,余1.8.3.12,加上前面的11.9.7和5(10)二选一,可得25+4+4
发表于 2018-02-05 11:54:12 回复(0)
在这里的两种方法我都试了一下都是33个数字。 ㈠法1:答案是:所有奇数25个,加上部分偶数8个(4.12.16.20.28.36.44.48)。 ㈡法2:选择一半:答案为26~50加上7~12加上2~3。 这两种方法都可以写出明确的算法,并非胡乱抽数字。 ①法1是标记剔除法,刚开始所有数都处于未标记状态,用0表示,有标记后用1表示,再次被标记则从1变成0。第一步标记2的倍数,第二步标记4的倍数,第三步标记8的倍数……第五步标记32的倍数,64大于50无可标记。最后剔除掉所有被标记为1的数。 ②法2是择半选择法,选择一半,剔除这一半对应的一半,不断重复这个过程。选择26到50就必须剔除13到25,选择7到12就必须剔除4到6,选择2到3就必须剔除1。 对于更大的数据,希望有大神能在时间复杂度和空间复杂度上,对这两种方法进行分析。
编辑于 2017-03-08 18:59:15 回复(0)
首先选出26-50共25个数,肯定不会有他们的二倍的数在集合中.同时可以去掉13-25,因为他们的二倍全在26-50中.
剩下1-12.此时类似原问题,选择7-12共6个数(他们的二倍已经被去掉了).同时去掉4-6,也因为他们的二倍都在7-12中.
最后可以选择1,3两个数.
这样总共有25+6+2=33个
发表于 2015-08-24 15:43:12 回复(15)
所以奇数+部分偶数(4,12,16,20,28,36,44,48)
25+8=33
编辑于 2015-08-24 10:22:04 回复(4)
1 3 4 5 7 9 11 12 26~50 共33个
发表于 2015-08-26 21:30:37 回复(0)
 1>首先想到的是1-50的后半部分:26-50,这是25个数;
2>不要忘记1-25这里面的数还可以用,即2x<26的x:12,11,10,9,8,7;
3>接着想一下还有一些更小的数的2X 也不在这里面:2,3;
所以最后是25+6+2 =33; 
发表于 2016-08-05 17:31:36 回复(0)
首先奇数25个。奇数的二倍数去掉,四倍数留下,八倍数去掉得出来的个数为8。结果25+8=33
发表于 2015-10-20 18:19:48 回复(0)
发表于 2015-08-31 14:33:49 回复(0)
牛皮,还有这操作,我还天真的认为就是25个。。。
发表于 2019-01-23 21:09:52 回复(0)
26~50共25个,1~12之间奇数6个加上4、12两个偶数。
发表于 2015-08-24 09:42:50 回复(2)
首先选出26-50共25个数,肯定不会有他们的二倍的数在集合中. 同时可以排除13-25。在1-12中选择所有奇数:1.3.5.7.9.11共6个。排除它们的2倍,剩下的 选择 4和12. 共计25+6+2=33个
发表于 2016-03-23 22:03:58 回复(0)
题意:
从1,2,3,......,49,50里选择一个集合S,集合中任意一个数字的二倍数不能出现在集合里,则S最多能有____个元素。
发表于 2020-12-08 22:44:41 回复(0)
这题的题意明明是一次性挑选……答案却是反复挑选
发表于 2019-02-07 14:53:15 回复(0)
1 3 5 7 8 9 11 12 26-50
发表于 2018-04-07 00:58:26 回复(0)
发表于 2017-05-15 15:07:32 回复(0)
1 2 3 5 7 8 9 11 12 13 15 17 19 20 21 23 25 27 28 29 31 32 33 35 36 37 39 41 43 44 45 47 48 49
我这就有34个数,求官方做一下验证
发表于 2016-04-18 10:25:20 回复(2)
奇数乘二得到偶数,所以所有奇数乘二后一定不在S中,还有就是挑选出一部分偶数,乘二不等于这些偶数就行,注意奇数乘二不能得到这些偶数。
发表于 2015-08-24 15:41:37 回复(0)