回溯法解0—1背包:
对某一物体,有两种可能,选或不选(分别用1,0表示)。使用递归,在遍历完n个数的时候,判断最终的数是否比最佳价值大,如果比最佳价值大,就把值赋给bestvalue
实现代码如下
#include <iostream>
using namespace std;
int c;//背包容量
int n;//物体个数
int w[11] = { 0 }; //初始化
int p[11] = { 0 };
int bestValue = 0;//最大价值
int currentValue = 0,currentW = 0;//当前背包里物体价值和质量
void backTack(int i);//递归函数
void init();//初始化函数
int main() {
while (cin >> n >> c) {//输入
if (n == 0 && c == 0) {//输入终止条件
break;
}
for (int i = 1; i <= n; i++) {
cin >> w[i];//输入每个物体质量
}
for (int i = 1; i <= n; i++) {
cin >> p[i];//输入每个物体价值
}
backTack(1);//递归
cout << bestValue << endl;//输出最大收益
init();//初始化判断下一组数据
}
}
void init() {//初始化
bestValue = 0;
currentValue = 0;
currentW = 0;
}
void backTack(int i) {
if (i > n) //递归终止条件
{
if (currentValue >= bestValue) {
bestValue = currentValue;//求最大收益
}
}
else {
if (currentW + w[i] <= c)//进入某节点(物体能放入的节点)
{
currentW += w[i];
currentValue += p[i];
backTack(i + 1);//从一节点继续(假设物体能放入在图中体现为1)
currentValue -= p[i];//从此处回溯
currentW -= w[i];
}
backTack(i + 1);//从另外一节点(假设物体不能放入在图中体现为0)
}
}
动态规划法:
#include <iostream>
using namespace std;
int Max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int c,n;
while(cin >> n >> c)
{
if(n==0&&c==0)break;
int w[10005],p[10005];
for(int i = 0;i < n;i++)
{
cin >> w[i];
}
for(int i = 0;i < n;i++)
{
cin >> p[i];
}
int dp[10005]={0};
for(int i = 0;i < n;i++)
{
for(int j = c;j >= w[i];j--)
{
dp[j] = Max(dp[j-w[i]]+p[i],dp[j]);
}
}
cout << dp[c] << endl;
}
return 0;
}