背包问题:
1.01-背包是最为广泛的动态规划问题,拥有许多变形,下面是一个简单的简历。
物品无限背包问题 : 用N种物品,每种均有无限多个,第i种物品体积为Vi,重量为Wi。选一些物品装到一个容量为C的背包中使得背包内的物体总体积在不超过C的前提下物体的重量最大?
分析:类似于硬币问题,只不过是把面值之和最大不超过S变为体积之和不超过C,另外增加了一个新的属性---重量相当于把无权图变成了带权图。这样就变成了以C为起点边权之和最大的路径。
#include <iostream>
#include <queue>
#include <functional>
using namespace std;
const int maxn = 100;
int vis[maxn], d[maxn];
int v[maxn], w[maxn];
int n, c;
int dp(int c)
{
int &ans = d[c];
if (ans != -1)
return ans;
ans = -(1 << 20);
for (int i = 0; i < n; i++)
{
if (c >= v[i])
{
ans = max(ans, dp(c - v[i]) + w[i]);
}
}
return ans;
}
int main()
{
cin >> n>>c;
for (int i = 0; i < n; i++)
cin >> v[i] >> w[i];
memset(d, -1, sizeof(d));
d[0] = 0;
cout<<dp(c);
system("pause");
}
2.01—背包问题2:
1.有N种物品,每种只有一个,第i种物品的体积为Vi,重量为Wi,选一些物品装到一个容量为C的背包中,使得背包内物体在不超过C的前提下尽量最大.(n>=1&&n<=100,v>=1&&v<=C&&C<=100,w>=1&&w<=1000000)
状态转移方程 F(i,j)=max{F(i-1,j),F(i-1,j-V[i])+W[i]};
点击打开链接 图表有助理解
下面没有理解:
// 分析:①此问题与上面问题不太一样,每个物品只有一个,此时上面的方法已经不适用了,可通过状态转移方程解决。
// ②用d(i,j)表示当前在第i层,背包剩余容量在j时接下来的最大重量和 d(i,j)=max(d(i+1,j),d(i+1,j-v[i]))+w[i];
// 解决:
// for(int i=n;i>=1;i--)
// for(int j=0;j<=C;j++)
// {
// d[i][j]=(i==n?0:d[i+1][j]);
// if(j>=v[i])
// d[i][j]=max(d[i][j],d[i][j-V[i]]+W[i]);
// }