總體思路是這樣的:
首先計算出單價,然後看最高單價的物品有多少個。
如果數量小於容量,則:總和+=單價*物品數;容量=容量-物品數;
否則:總和+=單價*物品數;退出計算;輸出總和;
其中只要容量還有,就算壹下個最高單價的物品,壹直重復算下去,到容量滿為止。
這個計算其實挺容易,就是輸入有點麻煩
希望妳可以認真看看吧。
*/
#include<stdio.h>
#include<string.h>
void input(int *num,int n)
{
int i;
char ch;
fflush(stdin); //清空緩存裏的數據
for(i=0;i<n;i++)
{
num[i]=0;
while(1) //只能用壹個內循環壹個個接收
{
scanf("%c",&ch);
if(ch==' ' || ch=='\n') break; //當碰到空格或回車就停止內循環
num[i]=num[i]*10+(ch-'0'); //否則就把原有的值剩10再加接收到的值。
}
}
}
void main()
{
int n;//物品種類
int c;//背包容量
int wi[10]; //重量
int vi[10]; //價值
double sum=0; //接收總和
double sinp[10],tmp; //單價
int i,j;
scanf("%d %d",&n,&c);
input(wi,n);//接收這裏有點費事,因為接收的數據是不定的,加上又是加空格分開的
input(vi,n);//所以也挺希望有誰有更好的方法分享壹下
for(i=0;i<n;i++) //求出單價
{
sinp[i]=(double)vi[i]/wi[i];
}
for(i=0;i<n;i++) //對單價從大到小排序
{
for(j=i+1;j<n;j++)
{
if(sinp[j]>sinp[i])
{
tmp=sinp[j];
sinp[j]=sinp[i];
sinp[i]=tmp;
tmp=wi[j]; //數量也交換壹下,壹會和單價壹起計算總量時要用
wi[j]=wi[i];
wi[i]=tmp;
}
}
if(c>wi[i]) //容量比物品數量多
{
sum+=(double)sinp[i]*wi[i]; //如果上面總價(vi)也交換的話,這可以寫為sum+=vi[i];
c-=wi[i];
}
else
{
sum+=(double)sinp[i]*c;
break; //容量滿了,退出
}
}
printf("%.1lf\n",sum);
}