• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LHgogo
博客园    首页    新随笔    联系   管理    订阅  订阅

【动态规划】背包问题----分组背包

逆序

题目描述

acwing 分组背包

要点

1.每组物品有若干个,同一组内的物品最多只能选一个
2.总体积不超过V
3.总价值最大

分析

状态计算

用v[i][j]表示第i组的第j个物品的体积,w[i][j]表示第i组的第j个物品的价值

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

int n, m;
int s[N];
int v[N][N], w[N][N], f[N];

int main()
{
    scanf ("%d%d", &n, &m);
    
    for (int i = 1; i <= n; i ++)
    {
        scanf ("%d", &s[i]);
        for (int j = 1; j <= s[i]; j ++)
        scanf ("%d%d", &v[i][j], &w[i][j]);    
    }
    
    for (int i = 1; i <= n; i ++)
        for (int j = m; j >= 0; j --) //即for (int j = m; j >= v[i][0]; j --)
            for (int k = 1; k <= s[i]; k ++)
            if (v[i][k] <= j)
            f[j] = max (f[j], f[j - v[i][k]] + w[i][k]);
            
    printf ("%d\n", f[m]);
    
    return 0;
}
posted on 2022-10-01 15:26  无人圣地  阅读(41)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3