今年的第一个问题,高分求一个算法! 找财务管理软件
其它说明:
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
int i, k;
//将每件货物压入队列中
for(i=0; i
int count= 0;
int left= 0;
for(i=0; i
if (i==items.size()/8) left=items.size()%8; else left=8;
for(k=1; k
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]