【C语言】——背包问题详解
生活随笔
收集整理的這篇文章主要介紹了
【C语言】——背包问题详解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.題目描述:——背包問題
有若干物品,每種物品的價(jià)值和重量各不相同,將物品裝入一個(gè)容量有限的背包,如何選擇裝入的物品,使背包的價(jià)值最大。
2.題目分析:
要是背包中的物品價(jià)值最大,則需要在有限的重量中盡可能裝入價(jià)值更大的物品,基于這種思想則采取貪心算法
? ? ? ?首先計(jì)算物品的單位價(jià)值,即價(jià)值/重量,根據(jù)單位價(jià)值對(duì)物品進(jìn)行排序,優(yōu)先裝入單位價(jià)值高的物品,直至背包裝滿。
3.代碼實(shí)現(xiàn):
#include <stdio.h> int n;//物品數(shù)量 double c;//背包容量 double v[999];//物品的價(jià)值 double w[999];//物品的重量 double cw = 0.0;//背包重量 double cp = 0.0;//背包價(jià)值 double bestp = 0.0;//當(dāng)前最優(yōu)價(jià)值 double perp[999];//物品性價(jià)比排序 int order[100];//物品編號(hào) int put[100];//裝入標(biāo)識(shí) void sort() {int i,j;int temporder = 0;double temp= 0.0;for(i=1;i<=n;i++)perp[i]=v[i]/w[i];for(i=1;i<=n-1;i++){for(j=i+1;j<=n;j++)if(perp[i]<perp[j])//冒泡排序perp[],order[],sortv[],sortw[]{temp = perp[i];perp[i]=perp[j];perp[j]=temp;temporder=order[i];order[i]=order[j];order[j]=temporder;temp = v[i];v[i]=v[j];v[j]=temp;temp=w[i];w[i]=w[j];w[j]=temp;}} } void backtrack(int i) {double bound(int i);if(i>n){bestp = cp;return;}if(cw+w[i]<=c){cw+=w[i];cp+=v[i];put[i]=1;backtrack(i+1);cw-=w[i];cp-=v[i];}if(bound(i+1)>bestp)backtrack(i+1); } double bound(int i) {double leftw= c-cw;double b =cp;while(i<=n&&w[i]<=leftw){leftw-=w[i];b+=v[i];i++;}if(i<=n)b+=v[i]/w[i]*leftw;return b; } int main() {int i;printf("請(qǐng)輸入物品的數(shù)量和容量:");scanf("%d%lf",&n,&c);for(i=1;i<=n;i++){printf("第%d個(gè)物品的重量和價(jià)值:",i);scanf("%lf %lf",&w[i],&v[i]);order[i]=i;}sort();backtrack(1);printf("最大價(jià)值為:%lf\n",bestp);printf("裝入的物品次序?yàn)?#xff1a;");for(i=1;i<=n;i++){if(put[i]==1)printf("%d ",order[i]);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的【C语言】——背包问题详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AND、OR运算符的组合使用
- 下一篇: 第十一期:数据挖掘其实就是为了干这四种事