买东西*。

有 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 个商店出售,商品在各商店的售价如下表所示:

ABC
112299
210308
3113512
4102811
512318

程序运行后输出是:

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

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

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

预设代码

前置代码

view plainprint?

  1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
  2. #include <stdio.h>  
  3.   
  4. typedef struct buy  
  5. {  char  gname;  
  6.    int   sname;  
  7.    int   gprice;  
  8. } BUY;  
  9.   
  10. int main( )  
  11. {  int i, j, n;  
  12.    int min, price[10][3];  
  13.    int findm( int n, int price[][3], BUY scheme[] );  
  14.   
  15.    static BUY scheme[3]={ {'A', 0, 0}, {'B', 0, 0}, {'C', 0, 0} };  
  16.   
  17.    scanf( "%d", &n );  
  18.    for( i = 0; i < n; i++ )  
  19.     for( j = 0; j < 3; j++ )  
  20.        scanf( "%d", &price[i][j] );  
  21.   
  22.    min = findm( n, price, scheme );  
  23.   
  24.    printf("Total Money are : %d\nGoods-Name  Shop-Name  Goods-Price\n", min );  
  25.    for ( i=0; i < 3; i++ )  
  26.        printf("         %c:%10d%13d\n", scheme[i].gname, scheme[i].sname, scheme[i].gprice );  
  27.    return 0;  
  28. }  
  29. /* int findm( int n, double gp[ ][3] ,BUY schm[ ] ) */  
  30. /* {                                                 */  
  31. /* {                                                 */  
  32.   
  33. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */  

#include <stdio.h> 
typedef struct buy  
{  char  gname;  
   int   sname;  
   int   gprice;  
}BUY; 
int findm( int n, int price[][3], BUY scheme[] )
{
	int i,j,k,min=1000;
	for(i=0;i<n;i++)
	for(j=0;j<n;j++)
	for(k=0;k<n;k++)
	if(i==j||j==k||i==k) continue;
	else if(price[i][0]+price[j][1]+price[k][2]<min)
	{
		scheme[0].sname=i+1;scheme[1].sname=j+1;scheme[2].sname=k+1;
		scheme[0].gprice=price[i][0];scheme[1].gprice=price[j][1];scheme[2].gprice=price[k][2];
		min=price[i][0]+price[j][1]+price[k][2];
	}
	return min;
}
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;  
}

遇到要求 解不重复 或 解有限制条件(如a*i+b*j*j+c*k*k*k==d) 的题用嵌套循环最简单,在重复时continue,别作

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值