这两天,做了太多的动态规划的题,结果都不会,所以决定用一周来看看,发现并用不了一周,两天就可以。先总结01背包的问题
问题,输入物品的个数,然后输入每个物品的重量,在输入每个物品的价值,最后输入背包可以容纳的总重量,求最大的组合方式。
代码:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int D_p(int *weight,int *value,int num,int maxweight)
{
if(weight == NULL || value == NULL || num <= 0 || maxweight <= 0)
return -1;
int **end = new int*[num+1];
for(int i = 0; i <= num; ++i)
{
end[i] = new int[maxweight+1];
}
memset(*end,0,(num+1)*sizeof(int));
for(int i = 1; i <= num; ++i)
{
end[i][0] = 0;
for(int j = 1; j <= maxweight; ++j)
{
if(j < weight[i-1])
end[i][j] = end[i-1][j];
else
{
int tmp = end[i-1][j - weight[i-1]] + value[i-1];
if(tmp < end[i-1][j])
end[i][j] = end[i-1][j];
else
end[i][j] = tmp;
}
}
}
return end[num][maxweight];
}
void main()
{
int num,maxweight;
cin>>num;
int *weight = new int[num+1];
int *value = new int[num+1];
if(weight == NULL || value == NULL)
exit(1);
int tmp;
for(int i = 0; i < num; ++i)
{
cin>>tmp;
weight[i] = tmp;
}
for(int i = 0; i < num; ++i)
{
cin>>tmp;
value[i] = tmp;
}
cin>>maxweight;
cout<<D_p(weight,value,num,maxweight)<<endl;
}总结一下,大概思想,就是用二维数组存放已经存在的计算结果,然后每次取值查看,提高效率。
1769

被折叠的 条评论
为什么被折叠?



