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的更多相关文章

  1. 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 ...

  2. [cf687c]The Values You Can Make(01背包变形)

    题意:给定n个硬币,每个硬币都有面值,求每个能构成和为k的硬币组合中,任意个数相互求和的总额种类,然后将所有硬币组合中最后得到的结果输出. 解题关键:在01背包的过程中进行dp.dp[i][j]表示组 ...

  3. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  4. 全部省市县数据库(MySQL脚本) (转)

    /*MySQL - 5.5.47 *************//*!40101 SET NAMES utf8 */; create table `base_area` (    `codeid` me ...

  5. JS+MySQL获取 京东 省市区 地区

    采集了一下JD的省市区地区 (非常简单,只是做个记录) 1.建表:account_area   2.进入页面: https://reg.jd.com/reg/company 在浏览器(Firefox) ...

  6. POJ 2785 4 Values whose Sum is 0 (二分)题解

    思路: 如果用朴素的方法算O(n^4)超时,这里用折半二分.把数组分成两块,分别计算前后两个的和,然后枚举第一个再二分查找第二个中是否有满足和为0的数. 注意和有重复 #include<iost ...

  7. hdu 6301 Distinct Values(贪心)题解

    题意:长为n的串,给你m个区间,这些区间内元素不重复,问这样的串字典序最小为? 思路:用set保存当前能插入的元素,这样就能直接插入最小元素了.对操作按l排序,因为排过的不用排,所以两个指针L,R是一 ...

  8. POJ 2785 4 Values whose Sum is 0(想法题)

    传送门 4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 20334   A ...

  9. POJ 2823 Sliding Window 题解

    POJ 2823 Sliding  Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...

  10. UVALive 6124 Hexagon Perplexagon 题解

    http://vjudge.net/problem/viewProblem.action?id=37480 East Central Regional Contest Problem C: Hexag ...

随机推荐

  1. Linux-centos中修改默认root帐户的登录用户名

    vi /etc/passwd 按i键进入编辑状态 修改第1行第1个root为新的用户名 按esc键退出编辑状态,并输入:x保存并退出 vi /etc/shadow 按i键进入编辑状态 修改第1行第1个 ...

  2. LaTeX 插入伪代码

    使用 algorithm 包和 algpseudocode 包 algorithm 包 用途: 提供一个浮动体环境来包含算法(类似于 figure 和 table 环境),使得算法可以自动编号并出现在 ...

  3. 自制 ShareLaTeX 镜像

    Overleaf 官方的 sharelatex 镜像的 TeX Live 版本可能较旧,无法安装最新的宏包,并且往往只包含了少量的基础宏包.为了方便使用,我们可以自己构建一个使用最新 TeX Live ...

  4. Ubuntu 设置 FTP 服务

    安装 VSFTP 服务 sudo apt install vsftpd 检查配置文件 sudo vim /etc/vsftpd.conf 确保以下配置项正确: #禁止匿名访问 anonymous_en ...

  5. jenkins动态切换环境

    一.代码层实现动态切换 1.首先在conftest.py下声明pytest_addoption钩子函数,写法如下 def pytest_addoption(parser): # 设置要接收的命令行参数 ...

  6. mysql 8.0.18 根据.ibd文件和建库SQL恢复数据

    前提:执行建库SQL,(包括建表的SQL) 1. 在mysql 的data文件夹中,找到需要恢复的DB名称,清除其文件夹下的所有文件,将待恢复的.ibd文件复制到此文件夹内 2. 执行SQL,然后查询 ...

  7. 页面多次跳转加载时,window.onscroll方法失效问题解决

    1. vue mounted 方法中,写有滚动监听方法,为A页面 window.scroll = function () { .... } 从A页面跳转到B页面,再从B页面跳转回A页面, window ...

  8. 【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常

    问题现象 客户的java日志中有如下异常信息: 问题的风险及影响 对正常的业务流程无影响,但是影响druid的merge sql功能(此功能会将sql语句中的字面量替换为绑定变量,然后将替换以后的sq ...

  9. 服务器文件打压缩包下载(java)

    public void download(HttpServletRequest request, HttpServletResponse response){ try { String downloa ...

  10. 暑假集训CSP提高模拟5

    听好了: 7 月 22 日,比样的学长就此陷落.每个陷落的学长都将迎来一场模拟赛,为这些模拟赛带来全新的题面. 你所熟知的一切都将改变,你所熟悉的算法都将加诸比样的考验. 至此,一锤定音. 尘埃,已然 ...