洛谷 Cut Ribbon

思路:我们可以看出,这是一道完全背包问题,但是呢,有一点需要注意:那就是我们在装背包的时候并不能保证一定能装满背包,但是这里的背包要求是让我们装满的,所以我们需要判断这个背包装满才行,所以用模板直接套是并不能解决问题的。

这里我们初始化了一下f数组,让它的全部值为-1,只令f0=0.这是因为需要进行递推,0是必须要有初始值的一个值。在我们判断的时候,for循环的第二层直接判断能不能装下,在里面我们写if判断条件的时候,我们需要需要判断一下当前的值是不是被更新过了,也就是说是不是用过了,没有用过说明我们递推到这里的时候这个状态并没有被更新,也就是说我们的背包是没有被装满的。

复制代码
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<cmath> 
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<sstream>
#include<numeric>
#include<map>
#include<limits.h>
#include<set>
#define int long long
#define MAX 20001
#define _for(i,a,b) for(int i=a;i<(b);i++)
#define ALL(x) x.begin(),x.end()
using namespace std;
using PII=pair<int, int>;
int n, m;
int counts;
int f[MAX];
int arr[MAX];
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    cin >> n;
    for (int i = 1; i <= 3; i++)
        cin >> arr[i];
    memset(f, -1, sizeof f);
    f[0] = 0;
    for (int i = 1; i <= 3; i++) {
        for (int j = arr[i]; j <= n; j++) {
            if (f[j - arr[i]] >= 0)
                f[j] = max(f[j], f[j - arr[i]] + 1);
        }
    }
    cout << f[n];
    return 0;
}
相关推荐
yuanyuan2o24 分钟前
Transformers NLP 任务:阅读理解问答
人工智能·算法·自然语言处理·nlp·github
做cv的小昊14 分钟前
计算机图形学:【Games101】学习笔记06——几何(曲线和曲面、网格处理)、阴影图
c++·笔记·学习·游戏·图形渲染·几何学·光照贴图
菜菜的顾清寒14 分钟前
力扣HOT100(52)动态规划 - 最长递增子序列
算法·leetcode·动态规划
WBluuue20 分钟前
数据结构与算法:树上启发式合并
数据结构·c++·算法·启发式算法
学无止境_永不停歇21 分钟前
从零手写高性能C++ TCP 服务器框架(十一) --- Connection实现
linux·服务器·网络·c++
努力的章鱼bro22 分钟前
CUDA编程入门
c++·人工智能·cuda
x_xbx37 分钟前
LeetCode:20. 有效的括号
算法·leetcode·职场和发展
计算机安禾38 分钟前
【算法设计与分析】第40篇:空间数据结构:KD树与四叉树的查询分析
数据结构·算法
努力努力再努力wz41 分钟前
【C++高阶数据结构系列】:跳表 SkipList 详解:多层索引、随机晋升与C++ 完整实现(附跳表实现的源码)
开发语言·数据结构·数据库·c++·redis·缓存·skiplist
江屿风1 小时前
C++图的两种构建算法流食般投喂-竞赛编
开发语言·c++·笔记·算法·图论