这道题目用c语言怎样解答?
思路:将商品按单价降序排序,先买最大值商品,再买最小值商品。最终余额最小。
我的代码中你如不想打印具体方案实施信息,就将该常量showInfo置0。
#include<stdio.h>
#include<malloc.h>
#define showInfo 1//是否打印方案信息,1打印,0不打印
typedef struct good
{
int goodId;//货物编号
char name[20];//货物名称
int value;//货物价格(单位分)
int bBuy;//被购买的个数(本题不做要求)
}GOD;
int *getLeastValue(int *n,GOD *goods,int nLen,int gLen);//获取最小找零金额
void showPlanInfo(int n,int m,int y,GOD g);//打印购买方案信息,n初始总金额,m当前剩余金额,g当前购买商品
int main()
{
int i,t,*n=NULL,*m=NULL;
GOD goods[3]={{1,"矿泉水",150,0},{2,"可乐",200,0},{3,"橙汁",350,0}};
scanf("%d",&t);
n=(int *)malloc(sizeof(int)*t);
if(!n)
return 0;
for(i=0;i<t;i++)
scanf("%d",&n[i]);
m=getLeastValue(n,goods,t,3);
for(i=0;i<t;i++)
printf("%d\n",m[i]);
return 0;
}
int *getLeastValue(int *n,GOD *goods,int nLen,int gLen)//获取最小找零金额
{
GOD gSave;
int i,j,*money=NULL,y;
money=(int *)malloc(sizeof(int)*nLen);
if(!money)
return NULL;
for(i=0;i<gLen;i++)
for(j=i+1;j<gLen;j++)
if(goods[i].value<goods[j].value)
gSave=goods[i],goods[i]=goods[j],goods[j]=gSave;
for(i=0;i<nLen;i++)
{
y=money[i]=n[i];//y记录上一次余额
for(j=0;j<gLen;j++)
{
if(money[i]>=goods[j].value)
{
goods[j].bBuy=money[i]/goods[j].value;
money[i]=money[i]%goods[j].value;//本次购买后的余额
showPlanInfo(n[i],y,money[i],goods[j]);
y=money[i];
}
}
}
return money;
}
void showPlanInfo(int n,int m,int y,GOD g)//打印购买方案信息,n初始总金额,m当前剩余金额,g当前购买商品
{
static int cnt=1;
if(showInfo)
{
if(m==n)
{
printf("方案%d:",cnt++);
printf("初始金额:%d,",n);
}
else
{
printf("当前剩余额:%d,",m);
}
printf("预购买商品%s,单价%d,预购买数量%d,余额%d\n",g.name,g.value,g.bBuy,y);
}
}
2019-10-16