01背包与部分背包

01背包

写在开头

有N件物品和一个容量为C的背包,第i件物品的费用是w[i],价值是v[i],求在不超过背包的最大容量下,求能得到最大的价值

  1. dp[i][j]表示前i件物品放入一个容量为j的背包可以获得的最大价值
  2. 考虑第i件物品(放与不放)那么就有两种状态。
  3. 如果不放,那么当前价值dp[i][j]=dp[i-1[[j-1],也就是和上一个状态相同的价值,因为我们并没有选择它放入背包,所以价值并没有变
  4. 如果放入,那么我们就要减去这个物品的体积,并加上它的价值,我们在放与不放之间选取一个最大的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)<
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值