01背包
写在开头
有N件物品和一个容量为C的背包,第i件物品的费用是w[i],价值是v[i],求在不超过背包的最大容量下,求能得到最大的价值
- dp[i][j]表示前i件物品放入一个容量为j的背包可以获得的最大价值
- 考虑第i件物品(放与不放)那么就有两种状态。
- 如果不放,那么当前价值dp[i][j]=dp[i-1[[j-1],也就是和上一个状态相同的价值,因为我们并没有选择它放入背包,所以价值并没有变
- 如果放入,那么我们就要减去这个物品的体积,并加上它的价值,我们在放与不放之间选取一个最大的dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - back[i].w] + back[i].v);
转移方程出来了题目就解决了一大半
题目描述
给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为C。如何选择装入背包的物品,可以使得装入背包中物品的总价值最大?
输入
每组输入包括三行,
第一行包括物品个数n,以及背包容量C。
第二、三行包括两个一维数组,分别为每一种物品的价值和重量。
输出
输出包括两行,第一行为背包的最大总价值,第二行为所选取的物品。
例如:最大总价值=15,物品选取策略为11001。
样例输入
5 10
6 3 5 4 6
2 2 6 5 4
样例输出
15
11001
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
typedef long long ll;
const int minn = 1e3 + 10;
int dp[minn][minn];
int a[minn];
int n, m;
struct node //定义一个结构体来储存每个物品的消耗与价值
{
int w, v;
} back[minn];
int ans()
{
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; ++i)
for (int j = 0; j <= m; ++j)<