當前位置:編程學習大全網 - 編程語言 - 這個背包問題(Knapsack Problem)程序怎麽寫?用C語言或C++。

這個背包問題(Knapsack Problem)程序怎麽寫?用C語言或C++。

/*

總體思路是這樣的:

首先計算出單價,然後看最高單價的物品有多少個。

如果數量小於容量,則:總和+=單價*物品數;容量=容量-物品數;

否則:總和+=單價*物品數;退出計算;輸出總和;

其中只要容量還有,就算壹下個最高單價的物品,壹直重復算下去,到容量滿為止。

這個計算其實挺容易,就是輸入有點麻煩

希望妳可以認真看看吧。

*/

#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);

}

  • 上一篇:數控編程指的到底是什麽!
  • 下一篇:匯編語言與高級語言的區別在哪裏?
  • copyright 2024編程學習大全網