暂时标题不公开
关于多维有界背包问题,在网上有很多实现的代码(如:多维有界背包问题),但是这些代码都是只是涉及到动态规划部分,而规划完成后的寻找各个物品的分配情况却没有实现,由于本人和同学需要实现这一功能,所以就在分析经典0-1背包问题的基础上实现了我们所需要的功能。
本函数所实现的是2018年华为软件精英比赛赛题的一部分功能,由于比赛还在进行中,所以算法暂不放出了,先把前期工作写一下
首先说明函数中的参数
void dynamicProg(flavor *flavors,server *servers,int *flaRemain,int flaNum,int serNum,int type_i, int *allocNum)
flavor :为结构体,虚拟机,也可以理解为物品,定义如下:
server :也是结构体,服务器,可以理解为书包
flavor 和 server中的 cpu 和mem 也就是需要考虑的两个维度
flaRemain 是一个数组,所记录的是每种flavor可以最多选择的个数,也就是边界。
struct flavor
{
int type; // flavor type, type=18 represent flavor18
int cpu; // cpu cores
int mem; // memory
int pred_num; // predict number of the flavor type
int server; // allocate to the server, default:-1 denote not allocated yet
};
struct server
{
char *type; // server type
int mem; // memory
int cpu; // cpu cores
int remain_cpu; // remaining cpu
int remain_mem; // remaining memory
// MAT alloc; // allocate info ------attension: MAT->double,should turn int in output_file------
intMat alloc;// allocate info ------attension: MAT->double,should turn int in output_file------
};
flavors 等可表示如下:
flavors (多种) | CPU MEM | flaRemain | servers(三种) | server CPU MEM |
---|---|---|---|---|
flavor1 | 1,1 | 20(个) | server0 | 56,128 |
flavor3 | 1,2 | 32(个) | server1 | 128,256 |
flavor5 | 2,4 | 2(个) | serever2 | 256,512 |
flavor18 | 4,8 | 45(个) | ||
… | … |
type_i:对应的是服务器的种类 0,1,2
allocNum:也是一个和flavors同大小的数组,存储的是各个种类的flavor经过动态规划后往服务器server中存储的数量。如allocNum[0]表示的flavors[0]中的虚拟机被存储的个数。
flaNum:表示的是虚拟机种类的个数,也就是flavors数组的大小。
serNum:表示的服务器的数量,在本函数中用不到,本函数只是考虑一个服务器。