首页 > 其他分享 >dp----得到方案方法的技巧

dp----得到方案方法的技巧

时间:2022-10-04 13:00:10浏览次数:79  
标签:技巧 卡片 int ---- second include dp first

《题一》

原题链接:https://atcoder.jp/contests/abc271/tasks/abc271_d

翻译:

问题陈述

有N张卡片,每面写一个整数。卡片 正面写着一个整数ai,背面写着一位整数bi。

您可以选择将每张卡片的正面或背面都显示出来。

确定您是否可以放置卡片,使可见整数的总和正好等于S。如果可能,请找到卡片的位置以实现它。

 

 

 

 如果只是问是否可以组成出来,十分好做,但是还要求方案

解决之道:

首先利用dp[i][j]:在前i张卡片中选择,能够到达数值正好为j,如果能为1,如果不能为0

然后利用反推

 

 其实就是如果dp[i][j]==1,那么这个必然是通过dp[i-1][j-a[i].first]或dp[i-1][j-a[i].second]转移过来

必然dp[i-1][j-a[i].first]或dp[i-1][j-a[i].second]有一个为1,如果两个都为1选择其中一个即可

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 typedef pair<int, int> PII;
 6 const int N = 101, S = 10001;
 7 int n, s, dp[N][S];
 8 PII a[N];
 9 int main()
10 {
11     cin >> n >> s;
12     for (int i = 1; i <= n; i++)
13     {
14         int z, f;
15         scanf("%d%d", &z, &f);
16         a[i] = {z, f};
17     }
18     dp[0][0] = 1;
19     for (int i = 1; i <= n; i++)
20         for (int j = 1; j <= s; j++)
21         {
22             if (j >= a[i].first)
23                 dp[i][j] |= dp[i - 1][j - a[i].first];
24             if (j >= a[i].second)
25                 dp[i][j] |= dp[i - 1][j - a[i].second];
26         }
27     if (dp[n][s])
28     {
29         cout << "Yes" << endl;
30         string str = "";
31         for (int i = n; i >= 1; i--)
32         {
33             if (s >= a[i].first && dp[i - 1][s - a[i].first])
34             {
35                 str += 'H';
36                 s -= a[i].first;
37             }
38             else if (s >= a[i].second && dp[i - 1][s - a[i].second])
39             {
40                 str += 'T';
41                 s -= a[i].second;
42             }
43         }
44         for (int i = str.size() - 1; i >= 0; i--)
45             cout << str[i];
46     }
47     else
48         cout << "No";
49     return 0;
50 }

 

详细题解:https://atcoder.jp/contests/abc271/editorial/4939

 

标签:技巧,卡片,int,----,second,include,dp,first
From: https://www.cnblogs.com/cilinmengye/p/16753607.html

相关文章

  • 报告分享|2022全球手游玩家需求变化洞察报告
     报告链接:http://tecdat.cn/?p=287262020年全球疫情爆发,使人们居家和使用手机的时长增加,也带来了全球手游市场在过去两年的高增长。2022 年,海外手游市场增速开始放缓,但......
  • 成都单片机开发-STC15F2K60S2-LQFP44引脚含义以及1号引脚实物位置
    1、STC15F2K60S2-LQFP44引脚定义 2、1号引脚的位置一般来说,芯片有圆点的附近位置表示1号引脚,但是STC15F2K60S2-LQFP44这个单片机实物上有2个圆点,那么究竟哪一个才是1号......
  • 报告分享|2022年智能汽车市场研究
     报告链接:http://tecdat.cn/?p=28731IDC将智能汽车市场定义为∶利用互联网、loT、人工智能、移动通信、云计算等技术,与汽车及交通基础设施相关的公司、产品和服务所组成......
  • wordpress多节点部署+rsync备份图片
    基于LAMP架构搭建LB+web+mysql+nas架构,实现从web站点上传的图片自动同步(wordpress)环境:10.0.0.128apache+wordpress服务,数据库主库指向10.0.0.132,基于docker来安装,映射......
  • 字符串部分知识整理
    引入:字符串最长公共前缀(LongestCommonPrefix,LCP)普通求法利用hash。设需要求\(S,T\)字符串的LCP,则可以二分长度\(len\),求一个最大的\(len\)满足\(hash(S_1\sim......
  • Effective C++ - 条款7 - 关于基类的virtual析构和non-virtual析构
    如果基类的析构是non-virtual的,在使用baseclass指针指向一个derived对象,并且这个对象由baseclass指针删除时,derived对象的成分并没有被删除,原因是baseclass定义了一个n......
  • 软件开发工具填空题_20221004
    1第三代程序设计语言一般都是(  )语言。进入二十一世纪以来,软件开发工具的发展有两个鲜明的特点,第一个特点是面向网络,另一个特点是(来源软件的兴起和运用)。填空题1712......
  • 校园网多拨叠加网速
    一、操作示范(本文不涉及软路由内容,清晰明了,简单直白,适合无基础新手)1.手机链接WiFiCMCC-PTU。找到一根数据线,链接电脑,然后百度xx手机开启USB网络共享(如下图) 打开设置......
  • 2022.10.4markdown随笔
    Markdowm学习标题三级标题四级标题 字体helloworldhelloworldhelloworldhelloworld引用选择坚持,留住明天!分割线图片超链接点击跳转到哔哩哔哩列表......
  • flexbox(弹性布局)
    flexbox布局模块注意,设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。设置弹性布局的方法通过将display属性设置为flex,flex容器将可伸缩点击......