关于最少费用购物问题,有几段程序看不懂,希望能给我解释一下红色代码的作用?

罗爱我 2016-04-19 09:39:34
#include<stdio.h>
#include<string.h>
#define maxb 6 //所购商品种类数(0<=B<=5)
#define maxs 100//优惠商品种类数(0<=S<=99)
int purch[maxb][2];//存放预购商品数据
int offer[maxs][maxb];//存放优惠商品价数据
int product[maxb];
int num[1000];
int cost[maxb][maxb][maxb][maxb][maxb];
int b,s;//b件商品,s种组合


//初始化
void init()
{
int i,j,k;
int code,t,p;//code表编号,t表示优惠商品组合
memset(offer,0,sizeof(offer));
memset(purch,0,sizeof(purch));
memset(product,0,sizeof(product));
printf("请输入商品件数:");
scanf("%d",&b);
for(i=1;i<=b;i++)
{
scanf("%d %d %d",&code,&purch[i][0],&purch[i][1]);//code表示商品的编码;存放购买该种商品的总数;该商品的正常单价
num[code]=i;//商品的编号num[2]=1,num[8]=2
}
printf("请输入优惠组合数目:");
scanf("%d",&s);
for(i=1;i<=s;i++)
{
scanf("%d",&t);
for(j=1;j<=t;j++)
{
scanf("%d %d",&code,&p);
offer[i][num[code]]=p;//第i种优惠组合中编号为code的商品的数量
}
scanf("%d",&offer[i][0]);//利用0下标存第i种优惠组合的总价格
}
}


void mincost()
{
int i,min;
int A,B,C,D,E;
min=0;
for(i=1;i<=b;i++)
{
min=min+(product[i]*purch[i][1]);//正常单价购买
}
//遍历S种优惠组合
for(i=1;i<=s;i++)
{ //五种产品减去采用优惠组合的数量
A=product[1]-offer[i][1];
B=product[2]-offer[i][2];
C=product[3]-offer[i][3];
D=product[4]-offer[i][4];
E=product[5]-offer[i][5];
if(A>=0&&B>=0&&C>=0&&D>=0&&E>=0&&min>(cost[A][B][C][D][E]+offer[i][0]))
{
min=cost[A][B][C][D][E]+offer[i][0];
}
}
cost[product[1]][product[2]][product[3]][product[4]][product[5]]=min;
}

void dp(int i)
{
int j;
if(i>b){
mincost();
return;
}
for(j=0;j<=purch[i][0];j++)
{

product[i]=j;

dp(i+1);
}
}

int main(int argc, char *argv[])
{
int A,B,C,D,E;
init();
dp(1);
A=purch[1][0];
B=purch[2][0];
C=purch[3][0];
D=purch[4][0];
E=purch[5][0];

printf("%d\n",cost[A][B][C][D][E]);
return 0;
}







































...全文
204 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-04-20
  • 打赏
  • 举报
回复
搜“动态规划”
小灸舞 版主 2016-04-20
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
paschen 2016-04-20
  • 打赏
  • 举报
回复
建议不要光看代码,必要时单步跟踪程序运行,观察每步各变量的变化情况,这样会容易理解的多

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧