AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
  • 吐槽
  • 登录/注册

AcWing 3. 动态规划:从背包问题入门 1(完全背包)    原题链接    简单

作者: 作者的头像   当我回忆爱玛农 ,  2023-01-16 15:31:21 ,  所有人可见 ,  阅读 26


3


题目描述

有 N
种物品和一个容量是 V
的背包,每种物品都有无限件可用。

第 i
种物品的体积是 vi
,价值是 wi
。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式
第一行两个整数,N,V
,用空格隔开,分别表示物品种数和背包容积。

接下来有 N
行,每行两个整数 vi,wi
,用空格隔开,分别表示第 i
种物品的体积和价值。

输出格式
输出一个整数,表示最大价值。

数据范围
0<N,V≤1000

0<vi,wi≤1000

样例

输入样例
4 5
1 2
2 4
3 4
4 5
输出样例:
10

根据我们解决01背包问题的思路,我们可以顺利完成次题
先画图
QQ截图20230116131136.jpg

#include<iostream>
using namespace std;
const int N = 1010;
int f[N][N];
int v[N],w[N];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i = 1 ; i <= n ;i ++)
    {
        cin>>v[i]>>w[i];
    }

    for(int i = 1 ; i<=n ;i++)
      for(int j = 0 ; j<=m ;j++)
      {
          for(int k = 0 ; k*v[i]<=j ; k++)
             f[i][j] = max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
      }

    cout<<f[n][m]<<endl;
}

本题我们也有优化方案:我们先将f[i][j]给列出来
QQ截图20230116133646.jpg
再将f[i][j-v[i]]列出来
QQ截图20230116133651.jpg
通过比较,可以看出来,原式可以写为f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]),此时我们可以将01背包问题的优化思路重新运作一遍,并且这次不需要改变for循环方向。

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1010;
int f[N];
int w[N],v[N];
int n,m;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    cin>>v[i]>>w[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=v[i];j<=m;j++)
        {
            f[j]=max(f[j],f[j-v[i]]+w[i]);
        }
    }
    cout<<f[m]<<endl;
    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息