69,382
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_COUNT 100
//0记录材料规格长度,1记录总数,2记录最多需要的数量
int _material[MAX_COUNT][3] = { 0 };
int _num_material = 0;
void ComputeMaxNumNeeded(int needLength)
{
int i, maxNum;
for (i = 0, maxNum = 1; i < _num_material; ++i)
{
while (_material[i][0] * maxNum < needLength && maxNum < _material[i][1])
++maxNum;
_material[i][2] = maxNum;
}
}
int MinSurplus(int(*material)[3], int num, int needLength, int *result)
{
int i, j;
int len, totalLen = 0;
int minSurplus = INT_MAX;
// 递归结束条件
if (num == 0)
return 0;
*result = 0; //首先设置此索引默认值
for (i = 0; i <= (*material)[2]; ++i)
{
// 重置之后的索引记录项,防止之前计算45设置了但是此次却没有递归导致索引错误
for (j = 1; j < num; ++j)
*(result + j) = 0;
len = (*material)[0] * i;
// 如果还未够长度,则递归
if (len < needLength)
len += MinSurplus(material + 1, num - 1, needLength - len, result + 1);
// 判断此种情况是否为最优结果,是则记录所需信息
if (len > needLength && len - needLength < minSurplus)
{
*result = i;
totalLen = len;
minSurplus = len - needLength;
}
}
return totalLen;
}
int main()
{
int *result = 0;
int length = 0;
int i;
_material[0][0] = 28;
_material[0][1] = 2;
_material[1][0] = 49;
_material[1][1] = 3;
_material[2][0] = 55;
_material[2][1] = 4;
_num_material = 3;
ComputeMaxNumNeeded(115);
result = (int *)malloc(sizeof(int)*_num_material);
length = MinSurplus(_material, _num_material, 115, result);
printf("%d\n", length);
for (i = 0; i < _num_material; ++i)
printf("%d ", result[i]);
printf("\n");
free(result);
return 0;
}