当前位置:主页>仓库管理软件> 列表

今年的第一个问题,高分求一个算法! 找财务管理软件

仓库管理软件版1楼: 假设有这样一个业务要求,需要你最多同时使用8个盒子(有可能是1种,也可能少于8种,还有可能大于或者等于8种,如下面的N数组所述),到另一个地方去取东西,东西只能用指定的盒子去装,每一种东西需要装多少次我用一个数字描述的(如A[].Data),取每一种所用的盒子如A[].TS,求一个算法可以计算出每一次使用哪8个盒子(可以是1种或者多种,每种盒子可以使用多个)去取东西,再取完后,才能让取的总次数最少,以及每一次使用哪几种盒子和每种几个盒子。

其它说明:
1、最多一次使用8个盒子,但也可以少于8个,这8个盒子可以是多种或者一种的多个,又或者是多种的多个所组成;
2、在使用盒子的时候是,可以是所有的全用上,也可以先用一种或部分,但最多不能多于8个,没有用到的盒子可以后来再换上去,但如果换下来了,就不能再换上去了。
3、在给定的盒子种类中,肯定全部会用到;反过来说,给定的东西中也必须使用完所有的盒子才能取完;即东西与所用的盒子是完全对应的。


有这样的三个工具:
N[0]=X
N[1]=Y
N[2]=Z

从下面这个结构里取数据(A[].Data为需要取的数据的数量,A[].TS为取数据所用的盒子):
A[0].Data=50 A[0].TS=X
A[1].Data=34 A[1].TS=X


A[2].Data=43 A[2].TS=X
A[3].Data=23 A[3].TS=X
A[4].Data=54 A[4].TS=X
A[5].Data=1 A[5].TS=Y
A[6].Data=28 A[6].TS=Y
A[7].Data=23 A[7].TS=Y
A[8].Data=2 A[8].TS=Z
A[9].Data=9 A[9].TS=Z


思路提示:

用穷举法分别列出每种盒子一次用1个,用2个等,计算各自的次数,最后次数少的分配方法即为准确的分配方法。


我在线等,有不明白的可以再提问!

2楼: 看不懂呀,晕那??? 如财务管理软件

3楼: 什么地方不懂?

4楼: 做 标

5楼: 怎么没人啊,这个问题很难吗?还是没描述清楚?还是分数不够?

6楼: 确实没看懂.
1.工具是什么?就是上面说的盒子?
2.每个盒能装多少个?没有说明或定义啊.

仓库管理软件版7楼: 建议楼主把这个问题转移到“基础篇-数据结构”分类去吧——这个问题和数据库实在不
搭接啊...

8楼: 没有必要,既然没有其他条件,那么你第一次用最大的盒子,第二次用剩下的最大的盒子,...,不就OK了

9楼: 是数学嘛

10楼: 每个盒子只能装一件货物,而某种货物又要用特定盒子装,再加上可以随便组盒子,每次运送的盒子最多为8个。所以可以很简单的推理出去取货物的次数的工公式是“盒子数/8+1”。如果不知道盒子数要算出来也很简单,一个循环累加货物数量就是所需盒子数。

剩下的问题是“一次使用哪几种盒子和每种几个盒子”
这个问题很也简单,定义一个货物数组,每个元素的代表一件货物。之后以8为单位遍历数组,输出或者记录用了哪种盒子和盒子数量即可以。

你用的是C++?我现在去写个代码

11楼: #include "stdafx.h"
#include
#include
using namespace std;

/* 盒子种类 */
enum Box{X, Y, Z};

/* 货物资料 */
struct AItem {
int Data;
Box TS;
};

AItem A[10];

void output(int time, int id, int count)
{
printf("%.2d itemid:%.2d, box:%d, count: %d\n", time, id, A[id].TS, count);
}

int main(int argc, char* argv[])
{
A[0].Data=50; A[0].TS=X;
A[1].Data=34; A[1].TS=X;
A[2].Data=43; A[2].TS=X;
A[3].Data=23; A[3].TS=X;
A[4].Data=54; A[4].TS=X;
A[5].Data=1; A[5].TS=Y;
A[6].Data=28; A[6].TS=Y;
A[7].Data=23; A[7].TS=Y;
A[8].Data=2; A[8].TS=Z;
A[9].Data=9; A[9].TS=Z;

vector items;
int i, k;

//将每件货物压入队列中
for(i=0; i for(k=0; k items.push_back(i);

int count= 0;
int left= 0;
for(i=0; i count=1;
if (i==items.size()/8) left=items.size()%8; else left=8;

for(k=1; k if (items[i*8+k]!=items[i*8+k-1]) {
output(i, items[i*8+k-1], count);
count=1;
continue;
}
count++;
}
output(i, items[i*8], count);
}

printf("运送次数:%d 货物数:%d 最后一次运送货物数量: %d\n",
items.size()/8+1,
items.size(),
items.size()%8 );

return 0;

}

试试[:D]