0-1揹包問題 動態規劃法
0-1揹包問題:給定n種物品和一個揹包,物品i的重量是wi,價值是vi,揹包的容量是c。應如何選擇裝入揹包的物品,使裝入揹包的物品的價值最大?
例項:n=5,c=10, v={6 3 5 4 6}, w={2 2 6 5 4},最優值是15.
//0-1揹包問題
#include <stdio.h>
#define min(a,b) a>b?b:a
#define max(a,b) a>b?a:b
int main()
{
int n,c;
int *w, *v,*flag; //w代表每個物品的容積,v代表價值, flag代表是否出現
int **m; //m[i,j]用來儲存當剩餘容量為j時,可選擇的物品為i,i+1,...時,0-1揹包問題的最優值
int i,j,k;
int jMax;
printf("please input the number of things and the volume of the knap:");
scanf("%d %d",&n,&c);
w=new int [n];
v=new int [n];
flag=new int [n];
m=new int *[n];
for(i=0;i<n;i++)
m[i]=new int [c+1];
printf("input the volume of each thing:");
for(i=0;i<n;i++)
scanf("%d", &w[i]);
printf("input the value of each thing:");
for(i=0;i<n;i++)
scanf("%d",&v[i]);
//從最後一個元素倒著推導,即第n-1個元素
jMax=min(w[n-1]-1,c);
for(j=0;j<=jMax;j++)
m[n-1][j]=0;
for(j=w[n-1];j<=c;j++)
m[n-1][j]=v[n-1];
for(i=n-2;i>0;i--)
{
jMax=min(w[i]-1,c);
for(j=0;j<jMax;j++)
m[i][j]=m[i+1][j];
for(j=jMax;j<=c;j++)
m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
}
m[0][c]=m[1][c];
if(c>=w[0])
m[0][c]=max(m[1][c],m[1][c-w[0]]+v[0]);
printf("the max value is %d. and the concrete are:\n",m[0][c]);
for(i=0;i<n-1;i++)
{
if(m[i][c]==m[i+1][c])
flag[i]=0;
else
{
flag[i]=1;
c=c-w[i];
}
flag[n-1]=(m[n-1][c])?1:0;
}
for(i=0;i<n;i++)
if (flag[i])
printf("%d ",v[i]);
printf("\n");
return 0;
}
相關文章
- 0-1揹包問題(動態規劃)動態規劃
- 動態規劃解0-1揹包問題動態規劃
- 動態規劃0-1揹包動態規劃
- 動態規劃之 0-1 揹包問題詳解動態規劃
- 【動態規劃】0-1揹包問題原理和實現動態規劃
- 揹包問題----動態規劃動態規劃
- 【動態規劃】揹包問題動態規劃
- 動態規劃 01揹包問題動態規劃
- 【動態規劃】01揹包問題動態規劃
- 動態規劃-01揹包問題動態規劃
- 動態規劃篇——揹包問題動態規劃
- 動態規劃--01揹包問題動態規劃
- 【動態規劃】01揹包問題【續】動態規劃
- 動態規劃之0,1揹包問題動態規劃
- 動態規劃系列之六01揹包問題動態規劃
- 動態規劃-揹包類動態規劃
- 01揹包問題理解動態規劃演算法動態規劃演算法
- 動態規劃-揹包01問題推理與實踐動態規劃
- 【動態規劃】一次搞定三種揹包問題動態規劃
- 詳解動態規劃01揹包問題--JavaScript實現動態規劃JavaScript
- 詳解動態規劃01揹包問題–JavaScript實現動態規劃JavaScript
- 雙核處理(動態規劃的01揹包問題)動態規劃
- python 動態規劃(揹包問題和最長公共子串)Python動態規劃
- 動態規劃之01揹包問題(最易理解的講解)動態規劃
- 演算法-動態規劃-完全揹包演算法動態規劃
- 【演算法】0-1揹包問題演算法
- 01揹包動態規劃空間優化動態規劃優化
- leetcode題解(0-1揹包問題)LeetCode
- 【LeetCode動態規劃#06】分割等和子集(01揹包問題一維寫法實戰)LeetCode動態規劃
- 多重揹包動態規劃及空間優化動態規劃優化
- 前端與演算法-動態規劃之01揹包問題淺析與實現前端演算法動態規劃
- 洛谷 1064——金明的預算方案(動態規劃的揹包問題)動態規劃
- 揹包問題演算法全解析:動態規劃和貪心演算法詳解演算法動態規劃
- 【演算法資料結構Java實現】Java實現動態規劃(揹包問題)演算法資料結構Java動態規劃
- 【LeetCode動態規劃#08】完全揹包問題實戰與分析(零錢兌換II)LeetCode動態規劃
- “插花問題”的動態規劃法演算法動態規劃演算法
- 插花問題的“動態規劃法”演算法動態規劃演算法
- 揹包問題(01揹包與完全揹包)