c语言背包问题(动态规划解法)
生活随笔
收集整理的這篇文章主要介紹了
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语言背包问题(动态规划解法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产品原型制作_早期制作原型如何帮助您设计
- 下一篇: spring boot session超