原链接:https://blog.csdn.net/ktigerhero3/article/details/50385109
一直都不太明白遇到一个问题的时候如何确定动态规划,贪心算法,或者是回溯法,作者的博文解释的很明白,用一个形象生动的01背包问题解释了,不是什么样的问题选择什么样的方法,而是用这个方法如何解决你所遇到的问题。
1.动态规划
#include<iostream>
#include<math.h>
using namespace std;
int m[100][100];//m[i][j]表示可选物品1...i,容量为j时的最优解
int dp_knapsack(int w[],int v[],int c,int m[][100],int n)
{
int i,j;
//初始化
for(j=1;j<=c;j++)
m[1][j]=0;
for(j=w[0];j<=c;j++)
m[1][j]=v[0];
for(i=2;i<=n;i++)
{
for(j=1;j<=c;j++)
{
if(j<w[i-1])
m[i][j]=m[i-1][j];
else if(m[i-1][j]>=(m[i-1][j-w[i-1]]+v[i-1]))
m[i][j]=m[i-1][j];
else
m[i][j]=m[i-1][j-w[i-1]]+v[i-1];
}
}
return 0;
}
int main()
{
int weight[3]={16,15,15};
int value[3]={45,25,25};
int c=30;
dp_knapsack(weight,value,c,m,3);
cout<<m[3][30]<<endl;
}
2.贪心算法
不一定能求出最优解,在这个问题上表现的淋漓尽致。
3.回溯法
#include<iostream>
#include<math.h>
using namespace std;
int bestValue=0,curWeight=0,curValue=0;
int backtrack_knapsack(int w[],int v[],int c,int n,int i)
{
if(i>n)
{
if(curValue>bestValue)
{
bestValue=curValue;
}
return 0;
}
if(curWeight+w[i-1]<=c)
{
curWeight+=w[i-1];
curValue+=v[i-1];
backtrack_knapsack(w,v,c,n,i+1);
curWeight-=w[i-1];
curValue-=v[i-1];
}
backtrack_knapsack(w,v,c,n,i+1);
return 0;
}
int main()
{
int weight[3]={16,15,15};
int value[3]={45,25,25};
int c=30;
//dp_knapsack(weight,value,c,m,3);
backtrack_knapsack(weight,value,c,3,1);
printf("%d\n",bestValue);
}