首页 > 其他分享 >【动态规划】01背包专题

【动态规划】01背包专题

时间:2025-01-23 12:31:38浏览次数:1  
标签:01 int sum cin 背包 专题 tie INF include

01背包在恰好等于的情况下求最小物品数

MELON的难题

image
每个物品(石头)的价值w[i]就是其自己的个数,为1
体积题目已给出。

状态定义:f[i][j]表示在前i个物品中选,且体积总和恰好等于j需要的物品个数的最小值

初始化:
f[i][0] = 0 , 1 <= i <= n
f[0][j] = INF, 1 <= j <= m,答案是f[n][m]

二维版本

#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 32 * 1000 / 2 + 10, INF = 0x3f3f3f3f;

int f[N][N], v[N];
int n, m, sum;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++) cin >> v[i], sum += v[i];

    if (sum % 2) puts("-1");
    else
    {
        m = sum / 2;
        // 本题初始化是重中之重,卡了两天了
        // 起点1是因为从1开始读入的,终点m是容量,不能写成n物品件数
        for (int j = 1; j <= m; j++) f[0][j] = INF;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                f[i][j] = f[i - 1][j];
                if (j >= v[i]) f[i][j] = min(f[i][j], f[i - 1][j - v[i]] + 1);
            }
        }
        if (f[n][m] == INF) cout << "-1";
        else cout << f[n][m];
    }
    return 0;
}

一维版本

#include <algorithm>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 32 * 1000 / 2 + 10, INF = 0x3f3f3f3f;

int f[N], v[N];
int n, m, sum;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++) cin >> v[i], sum += v[i];

    if (sum % 2) puts("-1");
    else
    {
        m = sum / 2;
        // 本题初始化是重中之重,卡了两天了
        // 起点1是因为从1开始读入的,终点m是容量,不能写成n物品件数
        for (int j = 1; j <= m; j++) f[j] = INF;
        for (int i = 1; i <= n; i++)
        {
            for (int j = m; j >= v[i]; j--)
            {
                f[j] = min(f[j], f[j - v[i]] + 1);
            }
        }
        if (f[m] == INF) cout << "-1";
        else cout << f[m];
    }
    return 0;
}

标签:01,int,sum,cin,背包,专题,tie,INF,include
From: https://www.cnblogs.com/Tshaxz/p/18687540

相关文章

  • 102400118 林嘉祚 集训第一专题
    AC截图1、LongLoong本题易知字符串开头为L,结尾为ng,唯一不同的是中间o的个数,于是想到用3个字符串拼接得到目标字符串。(直接用for循环输出似乎更简单)#include<iostream>#include<string>usingnamespacestd;intmain(){ intn; cin>>n; stringstr="L"; stri......
  • No.12 数据可视化01
    主要内容:plot函数1.数据——mtcars(R内置数据集)mtcars结果:>mtcarsmpgcyldisphpdratwtqsecvsamgearcarbMazdaRX421.06160.01103.902.62016.460144MazdaRX4Wag21.06160.01103.902.......
  • [FJOI2016] 建筑师 题解
    显然有一个\(dp\)思路。设\(f_{i,j}\)表示现在修了\(i\)栋楼,从第一栋楼外侧能看到\(j\)栋楼的方案数,显然有:\[f_{i,j}=\begin{cases}[i=0](j=0)\\f_{i-1,j-1}+(i-1)f_{i-1,j}(j\ne0)\end{cases}\]一眼\(f_{i,j}=\begin{bmatrix}i\\j\end{bmatrix}\)。那么答案即为:\[\s......
  • 【2025-01-22】连岳摘抄
    20:00如果你一天只说一句祈祷,请说“谢谢你”。                                                 ——鲁米一是分清主次。有些任务,时间等不了的,要先做。比如生孩子。......
  • [TJOI/HEOI2016] 求和 题解
    为什么又是佳媛姐姐啊啊啊!斯特林数在这道题中不好处理,直接拆开:\[f(n)=\sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\j\end{Bmatrix}2^jj!\]\[=\sum_{j=0}^n2^jj!\sum_{i=0}^n\sum_{k=0}^j\frac{(-1)^k(j-k)^i}{k!(j-k)!}\]\[=\sum_{j=0}^n2^jj!\sum_{k=0}^j\frac{(-1)^k\sum\l......
  • 【动态规划】落花人独立,微雨燕双飞 - 8. 01背包问题
    本篇博客给大家带来的是01背包问题之动态规划解法技巧.......
  • 组合计数与构造专题
    CF1824B2\(k\)为奇数时,注意到每次好点移动一格至少会增加$\lfloor\frac{k}{2}\rfloor+1-\lfloor\frac{k}{2}\rfloor$的长度,所以好点个数为\(1\)。\(k\)为偶数时,注意到好点一定在一条链上,我们计算出有多少条边\((u,v)\)满足\(u\)和\(v\)为好点,答案就是边数......
  • [SDOI2016小学组] 数苹果(apple)
    题目描述苹果丰收了,有n堆苹果,小红就在苹果堆旁。小红已经知道了每堆苹果有多少个。她要问一问从第a堆到第b堆一共有多少个苹果。输入输入数字n,然后输入n个数据。再输入问m,然后输入c行数据。输出输出m次a到b堆一共有多少个。样例输入 复制51234......
  • Weblogic - V10.0.2 ~V10.3.6 - uddi 组件 SSRF 漏洞 - CVE-2014-4210
    0x01:漏洞简介Weblogic的uddi组件存在一个SSRF漏洞。利用该漏洞,攻击者可发送任意HTTP请求,进而对内网中的脆弱组件(redis、fastcgi)进行进一步的攻击。漏洞点:/uddiexplorer/(无需登录即可访问)0x02:影响版本Weblogic10.0.2~Weblogic10.3.60x03:环境搭建环境准备......
  • 洛谷题单指南-线段树的进阶用法-P4602 [CTSC2018] 混合果汁
    原题链接:https://www.luogu.com.cn/problem/P4602题意解读:在一堆果汁中选出若干果汁,使得最小的美味度最大,且总体价格小于等于g,总体体积大于L,求这个最大的美味度。解题思路:显然,应该对答案进行二分,二分到一个美味度x,那么接下来check()函数要做的事,就是在所有美味度>=x的果汁中,查......