01背包问题 蛮力算法 随机测试数据选取 测试数据

#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "time.h"

#define N 10
#define M 1024 //M的取值为2的N次幂
#define Nmax 50
struct object
{
int n;//物品的编号
int w;//物品的重量
int v;//物品的价值
}wup;
struct object wp[Nmax]; //物品的数组,N为物品的个数
int c=200;//背包的总重量


void force(int a[][N])//蛮力法产生4个物品的子集
{
int i,j;
int n=M;
int m,t;
for(i=0;i{ t=i;
for(j=N-1;j>=0;j--)
{
m=t%2;
a[i][j]=m;
t=t/2;
}
}
for(i=0;i{ printf("第%2d行:",i);
for(j=0;j{
printf("%2d-",a[i][j]);
}
printf("\n");
}
}

main()
{
int i=0,j=0;
int a[M][N]={0};
int Vmax=0;
int k=0,kmax=0;
int temp_w=0;
int temp_v=0;
FILE *fp;/*文件指针*/
int radom(int );
int startad; //背包测试数据随机选取起始标号,数据位1到50
startad=radom(50);

force(a);
if((fp=fopen("111.txt","r+"))==NULL)
{
printf("cannot open the file!");
exit(0);
}
//读取文件
for(i=0;i{
fscanf(fp,"%d%d%d",&wp[i].n,&wp[i].w,&wp[i].v);
}

for(i=0;i{
printf("%3d-%3d,%3d\n",wp[i].n,wp[i].w,wp[i].v);
}
//处理数据
for(i=0;i{ temp_w=0;
temp_v=0;
for(j=0;j{
temp_w=temp_w+a[i][j]*wp[j+startad].w;
temp_v=temp_v+a[i][j]*wp[j+startad].v;
k++;
}
//printf("k=%3d,temp_w=%3d,temp_v=%3d\n",k,temp_w,temp_v);
if(temp_w<=c)
{
if(Vmax<=temp_v)
{
Vmax=temp_v;
kmax=k;
printf("kmax=%2d,w=%3d,v=%3d\n",kmax,temp_w,Vmax);
}


}


}

printf("radom=%d\n",startad);

}


int radom(int intmax)
{
int x1,x2,x3,mid,re;
srand((int)time(NULL));
x1=rand();
x2=rand();
x3=rand();
mid=(x1+x2+x3)/3;
re=(int)(intmax*1.0*mid/(65535));
printf("随机数:%d--%d--%d--%d--%d \n",x1,x2,x3,mid,re);

return re;
}

//-------------------
//测试数据建立111.txt文件,路径放在与.C源文件在同一个文件夹下
1 71 26
2 34 59
3 82 30
4 23 19
5 1 66
6 88 85
7 12 94
8 57 8
9 10 3
10 68 44
11 5 5
12 33 1
13 37 41
14 69 82
15 98 76
16 24 1
17 26 12
18 83 81
19 16 73
20 26 32
21 18 74
22 43 54
23 52 62
24 71 41
25 22 19
26 65 10
27 68 65
28 8 53
29 40 56
30 40 53
31 24 70
32 72 66
33 16 58
34 34 22
35 10 72
36 19 33
37 28 96
38 13 88
39 34 68
40 98 45
41 29 44
42 31 61
43 79 78
44 33 78
45 60 6
46 74 66
47 44 11
48 56 59
49 54 83
50 17 48

相关文档
最新文档