题目:
有n件物品,每件物品的重量为w[i],价值为c[i],
现有一个容量为V的背包,问如何选取物品放入背包使得背包内的物品的总价值最大,输出最大价值。
若为:其中每种物品都只有 1件,则用01背包
若为:其中每种物品都只有 无穷件,则用完全背包
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 510;
int main() {
int n, V, w[MAXN], c[MAXN], dp[MAXN][MAXN];
//dp[i][v]表示前i件物品(1<=i<=n;0<=v<=V)(即:前i件物品中有的放有的不放)
//恰好(即:放完后可能还有空间,但再加任何一件都装不下)
//装入容量为V的背包中所能获得的最大价值
scanf("%d %d",&n, &V);
for(int i=0; i<n; i++)
scanf("%d",&w[i]);
for(int i=0; i<n; i++)
scanf("%d",&c[i]);
for(int v=0; v<=V; v++)
dp[0][v] = 0;
for(int i=1; i<n; i++)//当前物品
for(int v=w[i]; v<=V; v++)//当前容量
dp[i][v] = max(dp[i-1][v], dp[i-1][v-w[i]] + c[i]);//01背包
//若为完全背包:dp[i][v] = max(dp[i-1][v], dp[i][v-w[i]] + c[i]);
//不同之处:完全背包里选择当前物品后的物品数量是不变的(无穷件)
int maxmial = -1;
for(int v=1; v<=V; v++)
maxmial = max(maxmial, dp[n-1][v]);
printf("%d",maxmial);
//或直接输出:printf("%d %d",dp[n-1][V]);
return 0;
}
//01包样例:
//5 8
//3 5 1 2 2
//4 5 2 1 3
//输出10
DP - 01/完全 背包
最新推荐文章于 2022-05-18 11:40:24 发布