彩票N保M缩水问题(最小集合覆盖问题)

千与 2009-07-15 01:04:09
也就是彩票中的中N保M缩水问题。举例如下:
已知集合S =
[10130, 00101, 00110, 00100, 11010, 00103, 30030, 00300, 03033, 00303, 31033, 03031, 31031, 11013, 01111, 10131, 10333, 30100, 30103, 10001, 10000, 30313, 10003, 11001, 11333, 30311, 11331, 01103, 01100, 01101, 11130, 11131, 31300, 11030, 11031, 00131, 31103, 00130, 31101, 10010, 10011, 31100, 10013, 01311, 10110, 00033, 33013, 01313, 33030, 10310, 33031, 10311, 10313, 31000, 31001, 31003, 13031, 31111, 01301, 30330, 33001, 30331, 01303, 30333, 33003, 13311, 01010, 01011, 13000, 00010, 03133, 13003, 10301, 33130, 33300, 33131, 13103, 10303, 33303, 03331, 33301, 13301, 13300, 13111, 13010, 13011, 31130, 30001, 10100, 13013, 13113, 00331, 00333, 01001, 33313, 33113, 01031, 30110, 01033, 13333, 30113, 03313, 11103, 30013, 30010, 11100, 01130, 11101, 03113, 01133, 11301, 03111, 03110, 11303, 11300, 13330, 13331, 03310, 03013, 03011, 33100, 13130, 03003, 13131, 30301, 33101, 13133, 03303, 33103, 03301, 03300, 01331, 01333, 03103, 11113, 11110, 00001, 11313, 03101, 11311, 11310, 00313, 10031, 33331, 33333, 00311, 00310]

这个集合S有243个字符串,要求一个子集合T,使得S中每个字符串中有3个数字是对应位置相同的,并且要求T集合最小,看看有啥方法求集合T,这里的T可以为含有8个字符串的子集合[31111, 30303, 13000, 11101, 10313, 03330, 03033, 00030]。

等价描述:从S中任意取出一个字符串,例如第一个10130,它T中00030有三个位置数字对应相等。

目前世界上没有通用的解法,基本上都是使用近似算法,有什么样好的近似算法能解决N保M缩水问题呢。最近几乎搜遍了CSDN,及其将近整个互联网,都是理论描述比较多。

关键是怎么在实际应用中实现呢,急用,谢谢各位高手。
...全文
1165 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
linren 2009-07-29
  • 打赏
  • 举报
回复
(上接57楼)
【改进的方法】
1)4个数排列组合
2)4个数枚举
以上的思路不变
因为改变这个关系程序的时间级就变得无法另人承受了

可以改变的是选择的随机数的个数
这样1)中的情况就能在控制范围内进行增加了:
因为1)中的情况可计算:
n*(n-1)*(n-2)*(n-3)
-------------------
4*3*2*1
linren 2009-07-29
  • 打赏
  • 举报
回复
(上接57楼)
【完整运行结果】
rand map: 15, 34, 93, 101, 142, 161, 203, 215,
[ 1/70] test: 15, 34, 93,101,...
[ 2/70] test: 15, 34, 93,142,...
[ 3/70] test: 15, 34, 93,161,...
find |T|=8 answer:
"33103", "31301", "30010", "13113", "10000", "01330", "01031", "00331",
[ 4/70] test: 15, 34, 93,203,...
[ 5/70] test: 15, 34, 93,215,...
[ 6/70] test: 15, 34,101,142,...
[ 7/70] test: 15, 34,101,161,...
[ 8/70] test: 15, 34,101,203,...
[ 9/70] test: 15, 34,101,215,...
[10/70] test: 15, 34,142,161,...
[11/70] test: 15, 34,142,203,...
[12/70] test: 15, 34,142,215,...
[13/70] test: 15, 34,161,203,...
[14/70] test: 15, 34,161,215,...
[15/70] test: 15, 34,203,215,...
[16/70] test: 15, 93,101,142,...
[17/70] test: 15, 93,101,161,...
[18/70] test: 15, 93,101,203,...
[19/70] test: 15, 93,101,215,...
[20/70] test: 15, 93,142,161,...
find |T|=8 answer:
"33310", "33103", "30113", "13113", "10301", "10000", "01330", "01031",
find |T|=8 answer:
"33103", "33011", "30113", "13113", "10301", "10000", "01330", "01031",
[21/70] test: 15, 93,142,203,...
[22/70] test: 15, 93,142,215,...
[23/70] test: 15, 93,161,203,...
[24/70] test: 15, 93,161,215,...
[25/70] test: 15, 93,203,215,...
[26/70] test: 15,101,142,161,...
[27/70] test: 15,101,142,203,...
[28/70] test: 15,101,142,215,...
[29/70] test: 15,101,161,203,...
[30/70] test: 15,101,161,215,...
[31/70] test: 15,101,203,215,...
[32/70] test: 15,142,161,203,...
[33/70] test: 15,142,161,215,...
[34/70] test: 15,142,203,215,...
[35/70] test: 15,161,203,215,...
[36/70] test: 34, 93,101,142,...
[37/70] test: 34, 93,101,161,...
[38/70] test: 34, 93,101,203,...
[39/70] test: 34, 93,101,215,...
[40/70] test: 34, 93,142,161,...
[41/70] test: 34, 93,142,203,...
[42/70] test: 34, 93,142,215,...
[43/70] test: 34, 93,161,203,...
[44/70] test: 34, 93,161,215,...
[45/70] test: 34, 93,203,215,...
[46/70] test: 34,101,142,161,...
[47/70] test: 34,101,142,203,...
[48/70] test: 34,101,142,215,...
[49/70] test: 34,101,161,203,...
[50/70] test: 34,101,161,215,...
[51/70] test: 34,101,203,215,...
[52/70] test: 34,142,161,203,...
[53/70] test: 34,142,161,215,...
[54/70] test: 34,142,203,215,...
[55/70] test: 34,161,203,215,...
[56/70] test: 93,101,142,161,...
[57/70] test: 93,101,142,203,...
[58/70] test: 93,101,142,215,...
find |T|=8 answer:
"33301", "30113", "13113", "13030", "10301", "01330", "01031", "01000",
[59/70] test: 93,101,161,203,...
[60/70] test: 93,101,161,215,...
[61/70] test: 93,101,203,215,...
[62/70] test: 93,142,161,203,...
[63/70] test: 93,142,161,215,...
[64/70] test: 93,142,203,215,...
[65/70] test: 93,161,203,215,...
[66/70] test: 101,142,161,203,...
[67/70] test: 101,142,161,215,...
[68/70] test: 101,142,203,215,...
[69/70] test: 101,161,203,215,...
[70/70] test: 142,161,203,215,...
Press any key to continue

【算法说明】
在有限的范围内进行穷举

压缩的方法是取8个随机数
每次通过排列组合从8个随机数中选4个数
后面的数通过穷举来生成(层次限制在4以内,也就是说通过穷举的方法来找至多4个数)
linren 2009-07-29
  • 打赏
  • 举报
回复
【程序】
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>

char s[243][6]={
"33333", "33331", "33330", "33313", "33311", "33310", "33303", "33301",
"33300", "33133", "33131", "33130", "33113", "33111", "33110", "33103",
"33101", "33100", "33033", "33031", "33030", "33013", "33011", "33010",
"33003", "33001", "33000", "31333", "31331", "31330", "31313", "31311",
"31310", "31303", "31301", "31300", "31133", "31131", "31130", "31113",
"31111", "31110", "31103", "31101", "31100", "31033", "31031", "31030",
"31013", "31011", "31010", "31003", "31001", "31000", "30333", "30331",
"30330", "30313", "30311", "30310", "30303", "30301", "30300", "30133",
"30131", "30130", "30113", "30111", "30110", "30103", "30101", "30100",
"30033", "30031", "30030", "30013", "30011", "30010", "30003", "30001",
"30000", "13333", "13331", "13330", "13313", "13311", "13310", "13303",
"13301", "13300", "13133", "13131", "13130", "13113", "13111", "13110",
"13103", "13101", "13100", "13033", "13031", "13030", "13013", "13011",
"13010", "13003", "13001", "13000", "11333", "11331", "11330", "11313",
"11311", "11310", "11303", "11301", "11300", "11133", "11131", "11130",
"11113", "11111", "11110", "11103", "11101", "11100", "11033", "11031",
"11030", "11013", "11011", "11010", "11003", "11001", "11000", "10333",
"10331", "10330", "10313", "10311", "10310", "10303", "10301", "10300",
"10133", "10131", "10130", "10113", "10111", "10110", "10103", "10101",
"10100", "10033", "10031", "10030", "10013", "10011", "10010", "10003",
"10001", "10000", "03333", "03331", "03330", "03313", "03311", "03310",
"03303", "03301", "03300", "03133", "03131", "03130", "03113", "03111",
"03110", "03103", "03101", "03100", "03033", "03031", "03030", "03013",
"03011", "03010", "03003", "03001", "03000", "01333", "01331", "01330",
"01313", "01311", "01310", "01303", "01301", "01300", "01133", "01131",
"01130", "01113", "01111", "01110", "01103", "01101", "01100", "01033",
"01031", "01030", "01013", "01011", "01010", "01003", "01001", "01000",
"00333", "00331", "00330", "00313", "00311", "00310", "00303", "00301",
"00300", "00133", "00131", "00130", "00113", "00111", "00110", "00103",
"00101", "00100", "00033", "00031", "00030", "00013", "00011", "00010",
"00003", "00001", "00000"};

struct map{
unsigned a1;
unsigned a2;
unsigned a3;
unsigned a4;
unsigned a5;
unsigned a6;
unsigned a7;
unsigned a8;
};

int mycheck(char *a,char *b){
int cnt=0;
int i;
for(i=0;i<5;i++){
if(a[i]==b[i]) cnt++;
}
if(cnt>=3) return 1;
else return 0;
}

int isfull(struct map *a){
if((a->a1==4294967295)&&(a->a2==4294967295)&&(a->a3==4294967295)&&(a->a4==4294967295)
&&(a->a5==4294967295)&&(a->a6==4294967295)&&(a->a7==4294967295)&&(a->a8==524287)) return 1;
return 0;
}

void mergem(struct map *a,struct map *b){
a->a1|=b->a1;
a->a2|=b->a2;
a->a3|=b->a3;
a->a4|=b->a4;
a->a5|=b->a5;
a->a6|=b->a6;
a->a7|=b->a7;
a->a8|=b->a8;
}

void myprint(int *p,int n){
int i;
char rl[243];
memset(rl,0,sizeof(rl));
printf("find |T|=%d answer:\n",n);
for(i=0;i<n;i++){
rl[p[i]]=1;
}
for(i=0;i<243;i++){
if(rl[i]==1) printf("\"%s\", ",s[i]);
}
printf("\n");
}

int dif(struct map *a,struct map *b){
int cnt=0;
int i;
for(i=0;i<32;i++){
if(((a->a1&(1<<i))==0)&&((b->a1&(1<<i))!=0)) cnt++;
}
for(i=0;i<32;i++){
if(((a->a2&(1<<i))==0)&&((b->a2&(1<<i))!=0)) cnt++;
}
for(i=0;i<32;i++){
if(((a->a3&(1<<i))==0)&&((b->a3&(1<<i))!=0)) cnt++;
}
for(i=0;i<32;i++){
if(((a->a4&(1<<i))==0)&&((b->a4&(1<<i))!=0)) cnt++;
}
for(i=0;i<32;i++){
if(((a->a5&(1<<i))==0)&&((b->a5&(1<<i))!=0)) cnt++;
}
for(i=0;i<32;i++){
if(((a->a6&(1<<i))==0)&&((b->a6&(1<<i))!=0)) cnt++;
}
for(i=0;i<32;i++){
if(((a->a7&(1<<i))==0)&&((b->a7&(1<<i))!=0)) cnt++;
}
for(i=0;i<32;i++){
if(((a->a8&(1<<i))==0)&&((b->a8&(1<<i))!=0)) cnt++;
}
return cnt;
}

int ruler[243]={0};

void myrand(int *rd){
int i,r;
for(i=0;i<7;i++) r=(int)(10.0*rand()/(RAND_MAX+1.0));
rd[0]=(int)(32.0*rand()/(RAND_MAX+1.0));
rd[1]=32+(int)(32.0*rand()/(RAND_MAX+1.0));
rd[2]=64+(int)(32.0*rand()/(RAND_MAX+1.0));
rd[3]=96+(int)(32.0*rand()/(RAND_MAX+1.0));
rd[4]=128+(int)(32.0*rand()/(RAND_MAX+1.0));
rd[5]=160+(int)(32.0*rand()/(RAND_MAX+1.0));
rd[6]=192+(int)(31.0*rand()/(RAND_MAX+1.0));
rd[7]=214+(int)(30.0*rand()/(RAND_MAX+1.0));
}

int main(){
int i,j;
struct map m[243];
struct map mp,mp2;
int p[9]={0};
int tt=0;
int ll[8]={0};
int pp[8]={0};
srand((int)time(0));

/*create map*/
memset(m,0,sizeof(m));
for(i=0;i<243;i++){
for(j=0;j<32;j++){
if(mycheck(s[i],s[j])) m[i].a1|=(1<<j);
}
for(j=32;j<64;j++){
if(mycheck(s[i],s[j])) m[i].a2|=(1<<(j-32));
}
for(j=64;j<96;j++){
if(mycheck(s[i],s[j])) m[i].a3|=(1<<(j-64));
}
for(j=96;j<128;j++){
if(mycheck(s[i],s[j])) m[i].a4|=(1<<(j-96));
}
for(j=128;j<160;j++){
if(mycheck(s[i],s[j])) m[i].a5|=(1<<(j-128));
}
for(j=160;j<192;j++){
if(mycheck(s[i],s[j])) m[i].a6|=(1<<(j-160));
}
for(j=192;j<224;j++){
if(mycheck(s[i],s[j])) m[i].a7|=(1<<(j-192));
}
for(j=224;j<243;j++){
if(mycheck(s[i],s[j])) m[i].a8|=(1<<(j-224));
}
}

/*create rand*/
myrand(ll);
printf("rand map: ");
for(i=0;i<8;i++) printf("%d, ",ll[i]);
printf("\n");

for(pp[0]=0;pp[0]<8;pp[0]++){
for(pp[1]=pp[0]+1;pp[1]<8;pp[1]++){
for(pp[2]=pp[1]+1;pp[2]<8;pp[2]++){
for(pp[3]=pp[2]+1;pp[3]<8;pp[3]++){

p[0]=ll[pp[0]];p[1]=ll[pp[1]];p[2]=ll[pp[2]];p[3]=ll[pp[3]];
printf("[%2d/70] test: %3d,%3d,%3d,%3d,...\n",++tt,p[0],p[1],p[2],p[3]);//prt
for(p[4]=0;p[4]<243;p[4]++){
if(p[4]==p[3]||p[4]==p[2]||p[4]==p[1]||p[4]==p[0]) continue;
for(p[5]=0;p[5]<243;p[5]++){
if(p[5]==p[4]||p[5]==p[3]||p[5]==p[2]||p[5]==p[1]||p[5]==p[0]) continue;
if(p[5]<p[4]) continue;
for(p[6]=0;p[6]<243;p[6]++){
if(p[6]==p[5]||p[6]==p[4]||p[6]==p[3]||p[6]==p[2]||p[6]==p[1]||p[6]==p[0]) continue;
if(p[6]<p[5]) continue;
memset((char*)&mp2,0,sizeof(mp2));
for(i=0;i<7;i++) mergem(&mp2,&m[p[i]]);
if(isfull(&mp2)){
myprint(p,7);
}
for(p[7]=0;p[7]<243;p[7]++){
if(p[7]==p[6]||p[7]==p[5]||p[7]==p[4]||p[7]==p[3]||p[7]==p[2]||p[7]==p[1]||p[7]==p[0]) continue;
if(p[7]<p[6]) continue;
memset((char*)&mp,0,sizeof(mp));
mergem(&mp,&mp2);
mergem(&mp,&m[p[7]]);
if(isfull(&mp)){
myprint(p,8);
}
}//7
}//6
}//5
}//4
}//3
}//2
}//1
}//0
return 0;
}


【运行结果】
rand map: 15, 34, 93, 101, 142, 161, 203, 215,
[ 1/70] test: 15, 34, 93,101,...
[ 2/70] test: 15, 34, 93,142,...
[ 3/70] test: 15, 34, 93,161,...
find |T|=8 answer:
"33103", "31301", "30010", "13113", "10000", "01330", "01031", "00331",
[ 4/70] test: 15, 34, 93,203,...

(以上没有运行完,等到[70/70]时才算完结)

【说明】
以上的程序专门用于寻找|T|=8和|T|=7的解
chiwenzi 2009-07-28
  • 打赏
  • 举报
回复
感觉上|T|=7的解可能是不存在的
chiwenzi 2009-07-28
  • 打赏
  • 举报
回复
找到了|T|=8的解:"33331", "33300", "30101", "11013", "10113", "03301", "01130", "00030"
这个解应该是和前面的解不一样的,也不是通过52楼的方法扩展得到的解
linren 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 iwantnon 的回复:]
(2),对五位作置换得到的任是解。
你所说的“字符串移位”只不过是(2)的一种特殊情况罢了。
[/Quote]

的确是这样!……

[Quote=引用 52 楼 iwantnon 的回复:]
另外,对于优化问题,目标从来都是“找到一个最优解”,还没听说过要找到所有最优解的呢,事实上也没有必要。你学最短径算法,最小生成树算法等等,最优解都是不止一个的,要过找到所有最优解吗?
[/Quote]
其实我是这样想的:
为了找到|T|=7的答案……
可以以大量的的|T|=8的答案作为参考,来筛选出可能的答案……

目前感觉如果前4个数固定
后面的数按照排列组合
最后得到的|T|<=8的答案的数目>8
那么以这4个固定数组合出来的情况中或许有|T|=7的解……
linren 2009-07-28
  • 打赏
  • 举报
回复
已经放弃寻找|T|=7的答案了……

[Quote=引用 52 楼 iwantnon 的回复:]
另外,对于优化问题,目标从来都是“找到一个最优解”,还没听说过要找到所有最优解的呢,事实上也没有必要。你学最短径算法,最小生成树算法等等,最优解都是不止一个的,要过找到所有最优解吗? [/Quote]
导航问题通过动态规划每次找到的路径都是一样的
这就会产生另一个问题:“贪心的司机问题”

以前在一本杂志上看过这个问题:
韩国某个城市取消了一条公路,结果交通拥堵的状态不但没有增加,反而减少了
其内部原因是司机都选择了利于自己的“最优路径”

在最优解的基础上
有时还需要减少趋向性
所以更多的解是有必要的……
iwantnon 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 linren 的回复:]
以上的答案可以演变成更多的答案
比如说:
1)改变3、1、0
例如:3(新)=1(原),1(新)=3(原)

2)字符串移位
例如:
对于答案
T=["31101", "30300", "30130", "13013", "11011", "03331", "01333", "00100"]
字符串向右循环移位1
得到
T=["13110", "03030", "03013", "31301", "11101", "10333", "30133", "00010"]
这个也是正确的解……
[/Quote]

如果T是一个解,那么:
(1),对0,1,3作置换得到的任是解。
(2),对五位作置换得到的任是解。
你所说的“字符串移位”只不过是(2)的一种特殊情况罢了。

另外,对于优化问题,目标从来都是“找到一个最优解”,还没听说过要找到所有最优解的呢,事实上也没有必要。你学最短径算法,最小生成树算法等等,最优解都是不止一个的,要过找到所有最优解吗?

不过精神可嘉,跟我一样都是结了帖也要回,呵呵。
千与 2009-07-27
  • 打赏
  • 举报
回复
有使用旋转矩阵求解最小覆盖经验的朋友,请联系我MSN:shirdrn#hotmail.com(#->@),谢谢。
结贴。
linren 2009-07-27
  • 打赏
  • 举报
回复
(上接50楼)
50楼中的答案(包含通过演变的方法得到的答案)……
只是|T|=8的答案集合的一个很小的子集……
比如说下面的就没有:
"33303", "31000", "30131", "13333", "10101", "01110", "01011", "00010",
"33303", "30131", "13333", "11030", "10101", "01110", "01011", "00010",

目前还是不知道有没有|T|=7的答案……
如果有的话,因为有变换的方法,所以答案也一定有很多种……
linren 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 chiwenzi 的回复:]
32、33、34、41、42楼的答案都是错的
int mycheck(char *a,char *b){
int cnt=0;
int i;
for(i=0;i <5;i++){ //这里应该是5,不是6
if(a[i]==b[i]) cnt++;
}
if(cnt>=3) return 1;
else return 0;
}
修改后找到的最好答案是|T|=9,有如下几种:
"33330", "33111", "33003", "11331", "11113", "11000", "00333", "00110", "00001",
"33330", "33113", "33001", "11333"…
[/Quote]
恩……
的确是写错了……
目前找到的|T|=8的答案有:
T=["31101", "30300", "30130", "13013", "11011", "03331", "01333", "00100"]
T=["31130", "31101", "30300", "13013", "10313", "03331", "01100", "00031"]
T=["31101", "30300", "30131", "13310", "13013", "01333", "01030", "00101"]
T=["31300", "31101", "30130", "13013", "10033", "03331", "01100", "00311"]
T=["31101", "30301", "30130", "13030", "13013", "01333", "01310", "00101"]
T=["33103", "31101", "13013", "10310", "10030", "03331", "01333", "00010"]
T=["31300", "31130", "31101", "13013", "10331", "03331", "00100", "00013"]
T=["31101", "30301", "30131", "13013", "11330", "03010", "01333", "00100"]
T=["33103", "31101", "11011", "10310", "10030", "03331", "01333", "00010"]
T=["33333", "30300", "30130", "13013", "11011", "03101", "01103", "00330"]
T=["33103", "30300", "30130", "13013", "11011", "03331", "01333", "00100"]
T=["31331", "30300", "30130", "13013", "11011", "03101", "01103", "00330"]
T=["30300", "30130", "13301", "13013", "11011", "03011", "01333", "01103"]
T=["30300", "30130", "13131", "13013", "11011", "03011", "01333", "01103"]
T=["30300", "30130", "13131", "13013", "11011", "03011", "01333", "01103"]
T=["30300", "30130", "13013", "11303", "11011", "03331", "03101", "01013"]
T=["30300", "30130", "13013", "11133", "11011", "03331", "03101", "01013"]
T=["30300", "30130", "30101", "13100", "13013", "11331", "03331", "01013"]
T=["30300", "30130", "30101", "13013", "11331", "03331", "01100", "01013"]
T=["31100", "30300", "30130", "13013", "11331", "10103", "03011", "01333"]
T=["31100", "30300", "30130", "13013", "11331", "03011", "01333", "00101"]
T=["33100", "30300", "30130", "13333", "11011", "10101", "03331", "01013"]
T=["33100", "30300", "30130", "13333", "11011", "03331", "01013", "00103"]
T=["30300", "30130", "30103", "13333", "11100", "11011", "03011", "01333"]
T=["30300", "30130", "30103", "13333", "11011", "03100", "03011", "01333"]
T=["33131", "31313", "30300", "13013", "11033", "11011", "03331", "00100"]
T=["33131", "30300", "13013", "11033", "11011", "03331", "01113", "00100"]
T=["33311", "31133", "30300", "13031", "13013", "11011", "01333", "00100"]
T=["31133", "30300", "13031", "13013", "11011", "03111", "01333", "00100"]
T=["33131", "31133", "30300", "13013", "11011", "03303", "00330", "00100"]
T=["33131", "31133", "30300", "13013", "11011", "01301", "00330", "00100"]
T=["33110", "30300", "30101", "13013", "11033", "03331", "01311", "00100"]
T=["31130", "30300", "30101", "13013", "11033", "03331", "01311", "00100"]
T=["31100", "30300", "30131", "13031", "13013", "01333", "01311", "00100"]
T=["31100", "30300", "30113", "13031", "13013", "01333", "01311", "00100"]
T=["33100", "30300", "30133", "11033", "11011", "03331", "03313", "00100"]
T=["33100", "30300", "30111", "11033", "11011", "03331", "03313", "00100"]
T=["33130", "30300", "30103", "13031", "11011", "03313", "01333", "00100"]
T=["31110", "30300", "30103", "13031", "11011", "03313", "01333", "00100"]
T=["33301", "31033", "30130", "13013", "11313", "11011", "03331", "00100"]
T=["33301", "30130", "13013", "11313", "11011", "03331", "01003", "00100"]
T=["33031", "31303", "30130", "13311", "13013", "11011", "01333", "00100"]
T=["31303", "30130", "13311", "13013", "11011", "03001", "01333", "00100"]
T=["33301", "31303", "30130", "13013", "11011", "03133", "00330", "00100"]
T=["33301", "31303", "30130", "13013", "11011", "01131", "00330", "00100"]
T=["33000", "30130", "30101", "13013", "11313", "03331", "01031", "00100"]
T=["31300", "30130", "30101", "13013", "11313", "03331", "01031", "00100"]
T=["31100", "30301", "30130", "13311", "13013", "01333", "01031", "00100"]
T=["31100", "30130", "30003", "13311", "13013", "01333", "01031", "00100"]
T=["33100", "30303", "30130", "11313", "11011", "03331", "03033", "00100"]
T=["33100", "30130", "30001", "11313", "11011", "03331", "03033", "00100"]
T=["33300", "30130", "30103", "13311", "11011", "03033", "01333", "00100"]
T=["31000", "30130", "30103", "13311", "11011", "03033", "01333", "00100"]
T=["33101", "30110", "30000", "13013", "11011", "10100", "03331", "01333"]
T=["31103", "30110", "30000", "13013", "11011", "10100", "03331", "01333"]

以上的答案可以演变成更多的答案
比如说:
1)改变3、1、0
例如:3(新)=1(原),1(新)=3(原)

2)字符串移位
例如:
对于答案
T=["31101", "30300", "30130", "13013", "11011", "03331", "01333", "00100"]
字符串向右循环移位1
得到
T=["13110", "03030", "03013", "31301", "11101", "10333", "30133", "00010"]
这个也是正确的解……

目前尚未发现|T|=7的解
千与 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 iwantnon 的回复:]
想问一下楼主37楼那些“目前,我知道最好的压缩值为..”是从何而来?
[/Quote]

可以用一些缩水软件运算,或者到澳客和500wan网站试试。



有没有高手用更好的方式解决一下这个问题最小覆盖问题啊,比如旋转矩阵?
没有的话我马上要结贴了...
iwantnon 2009-07-27
  • 打赏
  • 举报
回复
我说过了,楼主的贪婪算法编写有误,但似乎没有引起重视。
iwantnon 2009-07-26
  • 打赏
  • 举报
回复
眼下想不出什么更好的方法了,做个总结吧:
http://blog.csdn.net/iwantnon/archive/2009/07/24/4377323.aspx
iwantnon 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 iwantnon 的回复:]
刚才用了点儿数学,可以证出:
对于中5保3的情况,有|T|>=7。
又因为已经找到了|T|=8的例子,所以可知:
中5保3的情况|T|min=7或者8。
那么到底7成不成呢?这是个“一步之遥远”的问题了。
[/Quote]
[Quote=引用 39 楼 iwantnon 的回复:]
好像又有点儿思路了,我试下能否进一步证明|T|min>=8,如果能证出,那么就可以断定|T|min=8了。
wait...
[/Quote]
楼上两帖都弄错了,组合数没算对,证明不能成立。汗。。。
iwantnon 2009-07-25
  • 打赏
  • 举报
回复
好像又有点儿思路了,我试下能否进一步证明|T|min>=8,如果能证出,那么就可以断定|T|min=8了。
wait...
iwantnon 2009-07-25
  • 打赏
  • 举报
回复
刚才用了点儿数学,可以证出:
对于中5保3的情况,有|T|>=7。
又因为已经找到了|T|=8的例子,所以可知:
中5保3的情况|T|min=7或者8。
那么到底7成不成呢?这是个“一步之遥远”的问题了。

千与 2009-07-25
  • 打赏
  • 举报
回复
中6保5:
利用该方式1(随机:http://hi.baidu.com/shirdrn/blog/item/2720311bab15a1108618bfe4.html)缩水处理后,由3^6=729压缩到约(随机值)141(目前,我知道最好的压缩值为73);
利用该方式2(贪婪:http://hi.baidu.com/shirdrn/blog/item/0bfcb4d3849ec5093af3cf87.html)缩水处理后,由3^6=729压缩到(确定值)99(目前,我知道最好的压缩值为73);

中6保4:
利用该方式1(随机:http://hi.baidu.com/shirdrn/blog/item/2720311bab15a1108618bfe4.html)缩水处理后,由3^6=729压缩到约(随机值)28(目前,我知道最好的压缩值为17);
利用该方式2(贪婪:http://hi.baidu.com/shirdrn/blog/item/0bfcb4d3849ec5093af3cf87.html)缩水处理后,由3^6=729压缩到(确定值)23(目前,我知道最好的压缩值为17);

中6保3:
利用该方式1(随机:http://hi.baidu.com/shirdrn/blog/item/2720311bab15a1108618bfe4.html)缩水处理后,由3^6=729压缩到约(随机值)10(目前,我知道最好的压缩值为6);
利用该方式2(贪婪:http://hi.baidu.com/shirdrn/blog/item/0bfcb4d3849ec5093af3cf87.html)缩水处理后,由3^6=729压缩到(确定值)9(目前,我知道最好的压缩值为6);



中5保4:
利用该方式1(随机:http://hi.baidu.com/shirdrn/blog/item/2720311bab15a1108618bfe4.html)缩水处理后,由3^5=243压缩到约(随机值)52(目前,我知道最好的压缩值为27);
利用该方式2(贪婪:http://hi.baidu.com/shirdrn/blog/item/0bfcb4d3849ec5093af3cf87.html)缩水处理后,由3^5=243压缩到(确定值)36(目前,我知道最好的压缩值为27);

中5保3:
利用该方式1(随机:http://hi.baidu.com/shirdrn/blog/item/2720311bab15a1108618bfe4.html)缩水处理后,由3^5=243压缩到约(随机值)12(目前,我知道最好的压缩值为8);
利用该方式2(贪婪:http://hi.baidu.com/shirdrn/blog/item/0bfcb4d3849ec5093af3cf87.html)缩水处理后,由3^5=243压缩到(确定值)12(目前,我知道最好的压缩值为8);

中5保2:
利用该方式1(随机:http://hi.baidu.com/shirdrn/blog/item/2720311bab15a1108618bfe4.html)缩水处理后,由3^5=243压缩到约(随机值)6(目前,我知道最好的压缩值为3);
利用该方式2(贪婪:http://hi.baidu.com/shirdrn/blog/item/0bfcb4d3849ec5093af3cf87.html)缩水处理后,由3^5=243压缩到(确定值)3(目前,我知道最好的压缩值为3);
iwantnon 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 shirdrn 的回复:]
中6保5:
利用该方式1(随机:http://hi.baidu.com/shirdrn/blog/item/2720311bab15a1108618bfe4.html)缩水处理后,由3^6=729压缩到约(随机值)141(目前,我知道最好的压缩值为73);
利用该方式2(贪婪:http://hi.baidu.com/shirdrn/blog/item/0bfcb4d3849ec5093af3cf87.html)缩水处理后,由3^6=729压缩到(确定值)99(目前,我知道最好的压缩值为73);

中6保4:
利用该方式1(随机:http://hi.baidu.com/shirdrn/…
[/Quote]
用我在35楼的贪婪算法(同样没附加任何优化),但是每一个得出的结果都比楼主的好很多。
由于贪婪算法是个确定算法,谁编结果都应该一样,所以我猜楼主的代码中可能有错误。
iwantnon 2009-07-25
  • 打赏
  • 举报
回复
想问一下楼主37楼那些“目前,我知道最好的压缩值为..”是从何而来?
加载更多回复(39)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧