日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言背包问题(动态规划解法)

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言背包问题(动态规划解法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述:

有若干個物品要裝進背包,并且每個物品有各自的價值,物品的數量、價值以及背包的容量由用戶輸入,求背包內能夠存入的最大價值為多少,并且求出此時放入了哪些物品

輸入格式:

第一行輸入物品的容量r和物品個數n

第二行輸入每個物品的重量

第三行輸入每個物品的價值

輸出格式:

第一行輸出背包中能夠存儲的最大價值

第二行輸出此時背包中的物品編號

思路分析:?

? 可以把這個問題看成是一個二維數組,行是物品編號,列是背包容量,若物品編號為2,背包容量為4,代表的則是當背包容量為4的時候,前兩個物品的最大價值。因此當行為物品數,列為背包容量時,即容量為n的背包能夠存儲的最大價值。

? 因此我們定義一個函數給全局變量二維數組賦值,返回二維數組右下角的值即可。

? 那么怎么判斷放入了哪些物品呢,此時可以根據算法來逆推,若當前物品在當前容量時的價值,與前一個物品在相同容量時的價值相等,則證明當前物品沒有被放進背包。若不相等,則證明當前物品放進了背包,此時物品數-1,容量數減去當前物品的重量。

? 因此,我們再定義一個函數來尋找背包內放入了哪些物品,并且還要定義一個全局數組,數組的長度就是物品數,數組里面默認都是0,如果在函數中判斷放入了該物品,則物品編號對應的值賦1,最后在主函數中判斷即可。,

樣例輸入:

10 3 3 4 5 4 5 6

樣例輸出:?

11 2 3

代碼實現:?

#include<stdio.h> int f[100][100];//構建最優矩陣,定義全局變量,默認賦0 int find[100];//定義一個數組,尋找背包內放入了哪些物品int best(int r,int n,int *weight,int *value)//定義一個構建最優矩陣的函數 { int i,j;for(i=0;i<=n;i++)f[i][0]=0;for(i=0;i<=r;i++)f[0][i]=0;for(i=1;i<=n;i++)for(j=1;j<=r;j++){ if(weight[i]<=j&&f[i-1][j-weight[i]]+value[i]>f[i-1][j])f[i][j]=f[i-1][j-weight[i]]+value[i];elsef[i][j]=f[i-1][j];}return f[n][r];}void object(int r,int n,int *weight)//定義一個函數尋找背包里面放入了哪些物品,因為改變的是全局變量find數組的值,所以函數可以不必有返回值 { int i,j=r;for(i=n;i>=1;i--){ if(f[i][j]!=f[i-1][j]) //如果當前價值,比不放當前物品的價值不一樣,則代表放入了當前物品{find[i]=1;j=j-weight[i];}} }int main() { int weight[100]={0};int value[100]={0};int r,n,i,maxvalue;//r為背包容量 n為物品數量 maxvalue為最大的背包價值scanf("%d%d",&r,&n);for(i=1;i<=n;i++)scanf("%d",&weight[i]);//輸入物品的重量for(i=1;i<=n;i++)scanf("%d",&value[i]);//輸入物品的價值maxvalue=best(r,n,weight,value);object(r,n,weight);printf("背包的最大價值為:%d\n",maxvalue);printf("背包里面存入了物品:");for(i=1;i<=n;i++)if(find[i]==1)printf("%d ",i);return 0;}

總結

以上是生活随笔為你收集整理的c语言背包问题(动态规划解法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。