题解:CF687C The Values You Can Make
CF687C The Values You Can Make 题解
题目翻译感觉不明不白的(至少我看了几遍没看懂),这里给个较为清晰的题面。
题目描述
给你 \(n\) 个硬币,第 \(i\) 个硬币有一个价值 \(c_i\),你需要从中选出一些价值和为 \(k\) 的硬币组成一个集合,再输出这个集合中硬币可能组成的价值和。
算法
动态规划,背包。
分析
看完我给的题面描述其实已经很清晰了。这道题可以分为两步:
- 从 \(n\) 个硬币中选出来价值和为 \(k\) 的硬币集合。
- 输出硬币集合所能凑出的价值和。
我们很容易发现如果是任意一个步骤都很好做,用 \(01\) 背包解决。看数据范围 \(n\le 500\),考虑套两个 \(01\) 背包。
现在设计状态。我们发现对于每个硬币,它都有三种处理可能:不选入硬币集合,选入硬币集合但不用来凑价值和,选入硬币集合且用来凑价值和。所以我们设 \(dp[i][j][k]\) 表示前 \(i\) 个硬币中选出价值和为 \(j\) 的硬币集合,用来凑出价值和 \(k\) 是否可行。
状态转移方程就很好推了,对于前一个硬币有上述三种处理可能,只要有一种可行那么这个硬币就可行,转移方程为 \(dp_{i,j,k}=dp_{i-1,j,k}|dp_{i-1,j-c_i,k}|dp_{i-1,j-c_i,k-c_i}\)。分别对应三种处理可能。
注意一下边界 \(dp_{0,0,0}=1\),最终遍历一遍 \(dp_{n,k,p}(0\le p\le 500)\),如果为真就说明可以凑出输出即可,复杂度 \(\mathcal O(n^3)\)。
注意一下直接开三维数组会 MLE,需要用滚动数组优化,这里不细说了,和 \(01\) 背包一样。
代码
码风较丑,不喜勿喷。(@jiayixuan1205 的好看去看她的)
#include<bits/stdc++.h>
using namespace std;
namespace Ryan
{
    const int N=500,M=505;
    int dp[M][M],c[M];
    int n,kk;
    signed work()
    {
        cin>>n>>kk;
        for(int i=1;i<=n;i++)
            cin>>c[i];
        dp[0][0]=1;
        for(int i=1;i<=n;i++)
            for(int j=N;j>=0;j--)
                for (int k=N;k>=0;k--)
                    if(j>=c[i])
                    {
                        dp[j][k]|=dp[j-c[i]][k];
                        if(k>=c[i])
                            dp[j][k]|=dp[j-c[i]][k-c[i]];
                    }
        int ans=0;
        for(int i=0;i<=N;i++)
            if(dp[kk][i])ans++;
        cout<<ans<<endl;
        for(int i=0;i<=N;i++)
            if(dp[kk][i])
                cout<<i<<" ";
        return 0;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return Ryan::work();
}
题解:CF687C The Values You Can Make的更多相关文章
- CF687C. The Values You Can Make[背包DP]
		C. The Values You Can Make time limit per test 2 seconds memory limit per test 256 megabytes input s ... 
- [cf687c]The Values You Can Make(01背包变形)
		题意:给定n个硬币,每个硬币都有面值,求每个能构成和为k的硬币组合中,任意个数相互求和的总额种类,然后将所有硬币组合中最后得到的结果输出. 解题关键:在01背包的过程中进行dp.dp[i][j]表示组 ... 
- 算法与数据结构基础 - 贪心(Greedy)
		贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ... 
- 全部省市县数据库(MySQL脚本)  (转)
		/*MySQL - 5.5.47 *************//*!40101 SET NAMES utf8 */; create table `base_area` ( `codeid` me ... 
- JS+MySQL获取 京东 省市区 地区
		采集了一下JD的省市区地区 (非常简单,只是做个记录) 1.建表:account_area 2.进入页面: https://reg.jd.com/reg/company 在浏览器(Firefox) ... 
- POJ 2785 4 Values whose Sum is 0 (二分)题解
		思路: 如果用朴素的方法算O(n^4)超时,这里用折半二分.把数组分成两块,分别计算前后两个的和,然后枚举第一个再二分查找第二个中是否有满足和为0的数. 注意和有重复 #include<iost ... 
- hdu 6301 Distinct Values(贪心)题解
		题意:长为n的串,给你m个区间,这些区间内元素不重复,问这样的串字典序最小为? 思路:用set保存当前能插入的元素,这样就能直接插入最小元素了.对操作按l排序,因为排过的不用排,所以两个指针L,R是一 ... 
- POJ 2785 4 Values whose Sum is 0(想法题)
		传送门 4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 20334 A ... 
- POJ 2823 Sliding  Window 题解
		POJ 2823 Sliding Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ... 
- UVALive 6124 Hexagon Perplexagon 题解
		http://vjudge.net/problem/viewProblem.action?id=37480 East Central Regional Contest Problem C: Hexag ... 
随机推荐
- Win32 滚动条控件
			1.创建控件 HWND hScrollBar = ::CreateWindow( WC_SCROLLBAR, //控件类名 NULL, ... 
- autorun.inf 配置
			autorun.inf 文件是一个配置文件,通常用于可移动磁盘(如 USB 驱动器和 CD/DVD)来自动执行某些操作或配置一些设置.当插入可移动磁盘时,Windows 会读取 autorun.inf ... 
- Kubernetes-8:Deployment、DaemonSet、Job、CronJob等各控制器介绍及演示
			前文中也都已经提及过k8s都有哪些常用的控制器,本文对这些控制器进行细剖及演示一下 RS与RC与Deployment关联 RC主要作用就是用来确保容器应用副本数保持用户的期望值数目,即如果有pod异常 ... 
- Docker高级篇:实战Redis集群!从3主3从变为4主4从
			通过前面两篇,我们学会了三主三从的Redis集群搭建及主从容错切换迁移,随着业务增加,可能会有主从扩容的,所以,本文我们来实战主从扩容 PS本系列:<Docker学习系列>教程已经发布的内 ... 
- 【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表
			在面试的时候,有时候我们会被问到这样的问题:子类A继承父类B,A a = new A();则父类B的构造函数.父类B静态代码块.父类B非静态代码块.子类A构造函数.子类A静态代码块.子类A非静态代码块 ... 
- Java连接MySQL示范
			通过驱动连接mysql数据库,驱动得跟源码在一块,如图 先分析这句 3306 是本地端口 students是要连接的数据库的名字 账号和密码,之前已经设置 接下来分析这个数据库内容: 这个要查的表是 ... 
- 忘记 mysql 8.0 root 密码 怎么修改
			本文copy自 Centos7重置Mysql 8.0.1 root 密码 问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码:找了网上好多资料都不尽相同,根据自己的 ... 
- XGBoost模型 0基础小白也能懂(附代码)
			XGBoost模型 0基础小白也能懂(附代码) 原文链接 啥是XGBoost模型 XGBoost 是 eXtreme Gradient Boosting 的缩写称呼,它是一个非常强大的 Boostin ... 
- JavaScript之Blob对象基本用法及分片上传示例
			Blob基本用法 创建 通过Blob的构造函数创建Blob对象: new Blob(blobParts[, options]) blobParts: 数组类型, 数组中的每一项连接起来构成Blob对象 ... 
- QT原理与源码分析之QT5原理与源码分析视频课程 补天云QT技术培训专家
			QT原理与源码分析之QT5原理与源码分析视频课程 补天云QT技术培训专家 以下是<< QT5原理与源码分析视频课程>>的完整目录. 第1章 准备 第1节 您可以学到什么? 第2 ... 
