问题描述
一个商店有100件衣服每件衣服上面都标有1到12的号码每次最多取4件衣服且取的号码不能重复多少次能够取完写出这个代码
解决方案
解决方案二:
你这个问题就有bug吧?1-12的号码是随机的?如果是随机的怎么可能保证每次都能取完?比如现在运气很糟糕100件的随机号码都是12号每次又不能取重复的你一次都取不了
解决方案三:
引用1楼crystal_lz的回复:
你这个问题就有bug吧?1-12的号码是随机的?如果是随机的怎么可能保证每次都能取完?比如现在运气很糟糕100件的随机号码都是12号每次又不能取重复的你一次都取不了
哦哦看错看成了每次取4件
解决方案四:
我的思路吧就是先把有重复的赛选出来比如1号*47号*99号*65号*24。。。然后竖着轮询的取这样次数就限制在最少了
解决方案五:
每次取4件,共25次取完12取4的组合共495种,如果还不能满足需要,则无解可以先数学推导一下
解决方案六:
最好的情况是100/4,要用25次,最坏的情况是这100件衣服都是同一个号码,要用100次,具体说来就是,把相同的号码排成组,比如5#:23个,7#20个,9#18个,等等,每次从相同的号码里各取一个,优先取个数最多的,优先级递减,直到有一个号码的所有相同的都被取完了,再换一个有相同号的来取,这样看来有两种情况:一是相同号码有最多的不大于25个,那么每次都从这个号码里选一个,当这个号码在第25次被选完时,其他号码也一定被选完了,所以这种情况一共要25次。二是相同的号码最多的大于25个,那么所需次数就是这个号码的个数了。也就是所需次数完全取决于相同号码数目最多的一个号。不知道我说的对不对,清不清楚,对你有没有帮助。
解决方案七:
3,5楼思路一样。+1谁来写代码?
解决方案八:
且取的号码不能重复是指一次取出中的号码不重复,还是每次取出的号码不重复?
解决方案九:
写了下,不知道对不对,没时间验证了。publicclassGroup{publicstringCardKey;//号码publicintCardCount;//该号码对应的数量}publicstringCreateStr(intMinIndex,intMaxIndex,intCardCount,intMax_Once){//模拟100个号牌List<int>OriginalCard=newList<int>();//存放返回的字符串,以|分隔开StringBuildermySB=newStringBuilder();//保证至少有一个MinIndex到MaxIndex的值for(inti=MinIndex;i<=MaxIndex;i++){OriginalCard.Add(i);}RandomtheRan=newRandom();for(inti=1;i<=CardCount-(MaxIndex-MinIndex+1);i++)//MaxIndex-MinIndex+1是上面已经加入的数目{OriginalCard.Add(theRan.Next(MinIndex,MaxIndex));}OriginalCard.Sort();//升序排序//建立各分组,号码以及对应的数量List<Group>theGroup=newList<Group>();for(inti=MinIndex;i<=MaxIndex;i++){GrouptempGroup=newGroup();tempGroup.CardKey=i.ToString();tempGroup.CardCount=OriginalCard.LastIndexOf(i)-OriginalCard.IndexOf(i)+1;theGroup.Add(tempGroup);}//开始取号intStart_Of_theGroup;while(theGroup.Count>0){Start_Of_theGroup=0;//从theGroup第一元素开始取for(inti=0;i<((Max_Once<=theGroup.Count)?Max_Once:theGroup.Count);i++){if(i==0)//一次取出的号码间用","分开{mySB.Append(theGroup[Start_Of_theGroup].CardKey);}else{mySB.Append(","+theGroup[Start_Of_theGroup].CardKey);}if(--theGroup[Start_Of_theGroup].CardCount==0)//该组完了,就从list里删除{theGroup.RemoveAt(Start_Of_theGroup);Start_Of_theGroup--;}Start_Of_theGroup++;}mySB.Append("|");}returnmySB.ToString();}
调用string[]str=CreateStr(1,12,100,4).Split('|');foreach(stringsinstr){richTextBox1.Text+=s+"rn";}
解决方案十:
大致思路:随机产生100个号码,放到OriginalCard,并升序排序分组,一个组放到Group的一个实例里,一个字段放号码,一个放数量;所有分组都放到theGroup这个list里在theGroup里取号,当发现theGroup里的元素数量为0,也就是CardCount==0时,删除这个元素,以减小链表长度;另一种方式是不删除元素,用游标指示取号起始位置,不知道哪种效率更高,还请大牛们分析下,改进下希望满足楼主需求
解决方案十一:
12个里面取4个,并4个不相同,应该是12*11*10*9=11880组合呀。25次是定死了。只能说每次的组合可能是什么。。。