标签:背包 num int maxValue 问题 cost thi 物品
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct thing
{
int cost; /* 代价 */
int value; /* 价值 */
}THING;
THING *thi = NULL; /* 保存物品信息 */
int maxCost = 0; /* 总金额 */
int count = 0; /* 物品数 */
int maxValueTmp[1000][100] = {-1}; /* maxValueTmp[i][j]保存花费i能放下前j个物品的最大价值,-1表示未知 */
int max(int a, int b)
{
return a >= b ? a : b;
}
/* 花费cost取前n个物品能获得的最大价值 */
int getMaxValue(int cost,int num)
{
int maxValue = 0;
if (maxValueTmp[cost][num] != -1)
{
maxValue = maxValueTmp[cost][num]; /* 获得保存的值 */
}
else if (num == 0) /* 如果只有1个物品(第1个物品num为0) */
{
if (cost >= thi[num].cost) /* 能够放下当前物品 */
{
maxValue = thi[num].value; /* 获得的价值就是当前物品的价值 */
}
else
{
maxValue = 0; /* cost值不够放下当前物品,获得价值为0 */
}
}
else if (cost >= thi[num].cost) /* cost值够放下当前物品(num),当前物品不是最后一个 */
{
maxValue = max((getMaxValue(cost-thi[num].cost,num-1) + thi[num].value), /* 放当前物品,value为用(cost-当前物品cost)去放前(num-1)个物品取得的价值加当前物品的价值 */
(getMaxValue(cost,num-1)) /* 不放当前物品,value为用(cost)去放前(num-1)个物品取得的价值 */
);
}
else /* cost值不够放下当前物品 */
{
maxValue = getMaxValue(cost,num-1);
}
maxValueTmp[cost][num] = maxValue; /* 保存cost值放前num个物品能取得的最大value */
return maxValue;
}
int main()
{
int i = 0;
scanf("%d %d",&maxCost,&count);
thi = (THING *)malloc((count)*sizeof(THING));
memset(thi,0,count*sizeof(THING));
memset(&maxValueTmp[0][0],-1,sizeof(maxValueTmp));
for (i = 0; i < count; i++)
{
scanf("%d %d",&thi[i].cost, &thi[i].value);
}
printf("%d\n",getMaxValue(maxCost,count-1));
return 0;
}
标签:背包,num,int,maxValue,问题,cost,thi,物品
来源: https://blog.csdn.net/zzj244392657/article/details/94568001
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。