CF189A Cut Ribbon(dp一维思想,完全背包最详细解析)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: CF189A Cut Ribbon(dp一维思想,完全背包最详细解析)

题目描述



Polycarpus has a ribbon, its length is nn . He wants to cut the ribbon in a way that fulfils the following two conditions:


  • After the cutting each ribbon piece should have length aa , bb or cc .
  • After the cutting the number of ribbon pieces should be maximum.


Help Polycarpus and find the number of ribbon pieces after the required cutting.


输入格式



The first line contains four space-separated integers nn , aa , bb and cc (1<=n,a,b,c<=4000)(1<=n,a,b,c<=4000) — the length of the original ribbon and the acceptable lengths of the ribbon pieces after the cutting, correspondingly. The numbers aa , bb and cc can coincide.


输出格式



Print a single number — the maximum possible number of ribbon pieces. It is guaranteed that at least one correct ribbon cutting exists.


题意翻译



给一长度为n的缎带,要求将其剪成若干长度为a,b,c的缎带,且缎带数量尽可能多。

输入格式: 输入仅一行,四个正整数n,a,b,c(n,a,b,c≤4000)。

输出格式: 输出仅一行,即缎带数量的最大值。


输入输出样例



输入 #1复制

5 5 3 2


输出 #1复制

2


输入 #2复制

7 5 5 2


输出 #2复制

2


dp解析,

#include<bits/stdc++.h>
using namespace std;
int n,a[12],f[120000];
int main() {
    cin>>n>>a[1]>>a[2]>>a[3];
    memset(f,-1,sizeof f);//为啥是-1,其他不行吗? 
    f[0]=0;//为啥一定要是f[0],我f[1]不行吗?
    for(int i=1;i<=3;i++)
        for(int j=a[i];j<=n;j++){
            if(f[j-a[i]]<0) continue;//当 j=a[i]为0我们就不用退出,或者踩到前面我们定义的f[j],我等下会解释为啥这样会可以统计出正确值。
            f[j]=max(f[j],f[j-a[i]]+1);//更新最大值,等下我也会解释,
        }
    cout<<f[n];//戚,为啥输出f[n],我输f[n-1]其他的不行吗?
    return 0;
}


1、首先我们考虑memset这个函数是初始0和-1;其他的必错;

2,为啥我们f[0]=0;而不是f[1]=0;因为我们执行下面循环的判断,代表着我们刚刚开始循环的时候可以切下我们指定的彩带,也就是存下来。


3.例如          如果是 5 5 3 2

第一轮是a[1]=5 然后f[5]=1;

    第二轮的时候a[2]=3 会给f[3]赋值1;

            第三轮   a[3]=2 ,f[2]=1;这时候我们继续j++,发现循环到j=5,我们f[j-2]=f[3]=1;这个我们发现了  if(f[5-a[3]]<0) continue;不符合,所以我们可以执行下面的循环  f[j]=max(f[j],f[j-a[i]]+1);最后就是f[5]=2;为什么会这样呢,因为我们看成我们剪了一个长度为2的彩带,然后我们继续j++的时候发现当j=5,我们f【3】=1,可以继续执行循环相当于又可以剪一刀,这个时候我们由统计了一个f【5】的值,然后我们通过循环max取出最后的值f【n】就是我们要的答案。


4.最后为啥是f[n],因为我们的背包是n,所以我们取f[n]。


最后,为什么这样减是最多的,因为我们用了 f[j]=max(f[j],f[j-a[i]]+1);//更新f[j]最大值,,这里我们最后输出的f【n】,代表背包体积是n;


相关文章
|
4月前
|
负载均衡 Java API
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
Feign 进行rpc 调用时使用ribbon负载均衡源码解析
71 11
|
负载均衡 Java 索引
Spring Cloud 五大核心组件解析之Ribbon组件IRule详解(上)
Spring Cloud 五大核心组件解析之Ribbon组件IRule详解(上)
|
6月前
|
负载均衡 算法 Java
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
157 0
|
Java 调度 Spring
Spring Cloud 五大核心组件解析之Ribbon组件IRule详解(下)
Spring Cloud 五大核心组件解析之Ribbon组件IRule详解(下)
|
负载均衡 算法 网络协议
Spring Cloud 五大核心组件解析之Ribbon简介
Spring Cloud 五大核心组件解析之Ribbon简介
|
6月前
|
JSON 负载均衡 Java
Spring Cloud Ribbon:负载均衡的服务调用
Spring Cloud Ribbon:负载均衡的服务调用
102 0
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
3月前
|
负载均衡 算法 Java
SpringCloud之Ribbon使用
通过 Ribbon,可以非常便捷的在微服务架构中实现请求负载均衡,提升系统的高可用性和伸缩性。在实际使用中,需要根据实际场景选择合适的负载均衡策略,并对其进行适当配置,以达到更佳的负载均衡效果。
57 13
|
5月前
|
负载均衡 算法 Java
Spring Cloud Netflix 之 Ribbon
Spring Cloud Netflix Ribbon是客户端负载均衡器,用于在微服务架构中分发请求。它与RestTemplate结合,自动在服务发现(如Eureka)注册的服务之间进行调用。配置包括在pom.xml中添加依赖,设置application.yml以连接Eureka服务器,并在配置类中创建@LoadBalanced的RestTemplate。通过这种方式,当调用如`/user/userInfoList`的接口时,Ribbon会自动处理到多个可用服务实例的负载均衡。
|
5月前
|
缓存 负载均衡 Java
Java一分钟之-Spring Cloud Netflix Ribbon:客户端负载均衡
【6月更文挑战第9天】Spring Cloud Netflix Ribbon是客户端负载均衡器,用于服务间的智能路由。本文介绍了Ribbon的基本概念、快速入门步骤,包括添加依赖、配置服务调用和使用RestTemplate。此外,还讨论了常见问题,如服务实例选择不均、超时和重试设置不当、服务列表更新不及时,并提供了相应的解决策略。最后,展示了如何自定义负载均衡策略。理解并正确使用Ribbon能提升微服务架构的稳定性和效率。
192 3

推荐镜像

更多