一道c问题,还是请诸位帮我看看哪错了,这题比较复杂,不过主函数已给出

Timmy_Y 2012-04-28 05:20:14
42. 买东西
成绩: 10 / 折扣: 0.8
有 3 种商品在 N 个商店出售,同样商品在不同商店的售价各不相同,假定商店名称用数字1、2、3、4、......来表示,商品的名称用A、B、C来表示。

如果按照最先购买商品A、再购买商品B、最后购买商品C的顺序购买商品,且在一个商店只能购买一种商品。请编程设计一个购物方案,用最少的钱购得 3 种商品。

编写求购物方案的函数:int findm(int n, double gp[ ][3], BUY schm[ ] );

其中:n 是商店数量,gp[][] 是保存商品价格表的数组名,schm[ ] 是保存求得购物方案的数组名;函数的返回值是购得 3 种商品的总钱数。

保存求得购物方案的是一个结构类型为 BUY 的结构数组,结构 BUY 的定义如下:

typedef struct buy
{
char gname; /* 商品名称 */
int sname; /* 商店名称 */
int gprice; /* 商品价格 */
} BUY;

例如:有 3 种商品,在 5 个商店出售,商品在各商店的售价如下表所示:



A B C
1 12 29 9
2 10 30 8
3 11 35 12
4 10 28 11
5 12 31 8


程序运行后输出是:

Total Money are: 46
Goods-Name Shop-Name Goods-Price
A: 2 10
B: 4 28
C: 5 8

其中第一行是购物的总钱数,第二行是购物方案的表头,从第三行起每行为一种商品名和商店名、该种商品在该店的价格。商品名用大写英文字母表示,从 A 开始,商店名用数字表示,从 1 开始。购物方案的输出顺序按商品名英文字母升序排列。

注意:只提交自编的函数 findm,不要提交主函数。给定的程序已经控制好了输出的格式,你只要你的方案按要求放入数组即可

预设代码
前置代码
view plaincopy to clipboardprint?
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */

#include <stdio.h>

typedef struct buy
{ char gname;
int sname;
int gprice;
} BUY;

int main( )
{ int i, j, n;
int min, price[10][3];
int findm( int n, int price[][3], BUY scheme[] );

static BUY scheme[3]={ {'A', 0, 0}, {'B', 0, 0}, {'C', 0, 0} };

scanf( "%d", &n );
for( i = 0; i < n; i++ )
for( j = 0; j < 3; j++ )
scanf( "%d", &price[i][j] );

min = findm( n, price, scheme );

printf("Total Money are : %d\nGoods-Name Shop-Name Goods-Price\n", min );
for ( i=0; i < 3; i++ )
printf(" %c:%10d%13d\n", scheme[i].gname, scheme[i].sname, scheme[i].gprice );
return 0;
}




下面是我编写的所要求的函数

int findm(int n,double gp[][3],BUY schm[])
{ int i,j,k,u=0,p=0,q=0,w=0,e=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
{ if(i==j||j==k)
continue;
u=gp[i][0]+gp[j][1]+gp[k][2];
if(u<=p)
{p=u;
q=i;
w=j;
e=k;
i=0;
j=0;
k=0;
}
}
return(p);
scheme[0]={'A',i+1,gp[i][0]};
scheme[1]={'B',j+1,gp[j][1]};
scheme[2]={'C',k+1,gp[k][2]};
}
...全文
1129 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_seu 2012-04-29
  • 打赏
  • 举报
回复
实现的不太好,请多多指教!

#include <stdio.h>
#include <assert.h>

typedef struct buy
{
char gname;
int sname;
int gprice;
}BUY;
int price[][3] = { 12,29,9,
10,30,8,
11,35,12,
10,28,11,
12,31,8
};

int ifSameShop(int aShop, int bShop, int cShop)
{
if(aShop == bShop || aShop == cShop || bShop == cShop)
{
return 1;
}
else
{
return 0;
}
}
void SigalSchemeSet(BUY *schem, char gname, int sname, int gprice)
{
schem->gname = gname;
schem->sname = sname;
schem->gprice = gprice;
return;

}
int finm(int n, int price[][3], BUY scheme[])
{
int aS = 0;
int bS = 0;
int cS = 0;
int LowA = 0;
int LowB = 0;
int LowC = 0;
int sum = 0;
int MinSum = 10000;


for(aS = 0; aS < n; ++aS)
{
for(bS = 0; bS < n; ++bS)
{
for (cS = 0; cS < n; ++cS)
{
if(!ifSameShop(aS, bS, cS))
{
sum = price[aS][0] + price[bS][1] + price[cS][2];
if(sum < MinSum)
{
MinSum = sum;
LowA = aS;
LowB = bS;
LowC = cS;
}
}
}
}
}
SigalSchemeSet(&scheme[0], 'A', LowA + 1, price[LowA][0]);
SigalSchemeSet(&scheme[1], 'B', LowB + 1, price[LowB][1]);
SigalSchemeSet(&scheme[2], 'C', LowC + 1, price[LowC][2]);

return MinSum;

}
int main()
{
int (*pPrice)[3] = NULL;
int minTotal = 0;
int min;
BUY scheme[3] = {{0,0,0}, {0,0,0}, {0,0,0}};

pPrice = price;
min =finm(5, pPrice, scheme);
assert(min == 46);
assert(scheme[0].gname == 'A');
assert(scheme[0].sname == 2);
assert(scheme[0].gprice == 10);

assert(scheme[1].gname == 'B');
assert(scheme[1].sname == 4);
assert(scheme[1].gprice == 28);

assert(scheme[2].gname == 'C');
assert(scheme[2].sname == 5);
assert(scheme[2].gprice == 8);
printf("success!\n");
return 0;
}
Timmy_Y 2012-04-28
  • 打赏
  • 举报
回复
int findm(int n,double gp[][3],BUY schm[])
{ int i,j,k,u=0,p=999,q=0,w=0,e=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
{ if(i==j||j==k)
continue;
u=gp[i][0]+gp[j][1]+gp[k][2];
if(u<=p)
{p=u;
q=i;
w=j;
e=k;
i=0;
j=0;
k=0;
}
}
schm[0]={'A',i+1,gp[i][0]};
schm[1]={'B',j+1,gp[j][1]};
schm[2]={'C',k+1,gp[k][2]};
return(p);
} 也就是说 我改成这样是对的吗 ,麻烦指点
Timmy_Y 2012-04-28
  • 打赏
  • 举报
回复
请问楼上的高手 如果我把return放在最后 这个函数还有问题吗
huangwenshen 2012-04-28
  • 打赏
  • 举报
回复
1,p开始初始化为一个特大值比如说99999,要不你始终无法判断,因为p为0;
2,你为啥将i,j,k又设置为初值0呢?已经开始在循环判断了。
3,都已经return了,怎么还能对结构体赋值。

int findm(int n, int gp[][3], BUY schm[])
{
int iPriceA=0,iPriceB=0,iPriceC=0; //记录价格
int iMinA=0,iMinB=0,iMinC=0; //记录商店
int itotale=0; //记录总价格
int iMintotal=99999; //记录最小总价格

for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
if (j==i)
{
continue;
}
else
{
for (int k=0 ; k<n;k++)
{
if (k==i || k==j)
{
continue;
}
else
{
itotale=gp[i][0]+gp[j][1]+gp[k][2];
if (itotale < iMintotal)
{
iMintotal =itotale;
iMinA=i;
iMinB=j;
iMinC=k;
iPriceA=gp[i][0];
iPriceB=gp[j][1];
iPriceC=gp[k][2];
}
}
}
}
}

}

schm->gname='A';
schm->sname=iMinA+1;
schm->gprice=iPriceA;

(schm+1)->gname='B';
(schm+1)->sname=iMinB+1;
(schm+1)->gprice=iPriceB;

(schm+2)->gname='C';
(schm+2)->sname=iMinC+1;
(schm+2)->gprice=iPriceC;

return iMintotal;

}
Timmy_Y 2012-04-28
  • 打赏
  • 举报
回复
你千万不要问我主函数的内容,因为好多我也看不太懂 ,所以我最后写的这个scheme[0]={'A',i+1,gp[i][0]};
scheme[1]={'B',j+1,gp[j][1]};
scheme[2]={'C',k+1,gp[k][2]};
我也不知道行不行
Timmy_Y 2012-04-28
  • 打赏
  • 举报
回复
我这个就是穷举
hen_hao_ji 2012-04-28
  • 打赏
  • 举报
回复
先说一下,你是按什么算法做的吧

33,324

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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