Description
llk经常和wy一起去yh小饭馆吃盖浇饭,一天他们吃完后llk把两个人的钱一起付了,但是wy不想欠llk的钱。现在wy手中有一些散钱,llk手中也有一些散钱,wy想知道能不能刚好使得两不相欠,但是wy很笨,你能帮助wy吗?

Input
多组测试数据,每组第一行输入3个非负整数,C,n,m。C代表wy欠llk的钱,n代表wy手中钱面值的种类,m代表llk手中钱面值的种类。接下来的n行,每行两个数v, c,分别代表wy手中面值为v的钱币有c个。再接下来的m行,每行两个数v,c,分别代表llk手中面值为v的钱币有c个。 (C <= 10000; 1<=n, m<50; 0<=v < =100; 0<=c<=10 )

Output
每组数据输出一行,如果存在一种方案使得wy和llk两不相欠,输出YES,否则输出NO。

Sample Input
7 1 1
10 1
1 10

思路:多重背包记录dp的存在性。设p[]为wy的可能凑到钱,q[]为llk可能凑到的钱,分别dp一遍,求是否存在p[i]==q[i-c]==1即可。

dp状态: dp[i]即是否能凑到 金额为 i 的钱
dp转移: dp[j] |= dp[j-k*v[i]

#include <math.h>
#include <queue>
#include <string>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <set>
#include <algorithm>
#define ll long long
#define Inf 0x3f3f3f3f
using namespace std;
const int maxn=5e5+5;
struct node{int v,c;
};
node a[55],b[55];
int p[50050];
int q[50050];
int main()
{int c,n,m;while(cin>>c>>n>>m){memset(p,0,sizeof(p));memset(q,0,sizeof(q));int sum=0;for(int i=1;i<=n;i++){cin>>a[i].v>>a[i].c;sum+=a[i].v*a[i].c;}p[0]=q[0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=a[i].c;j++){for(int k=a[i].v*j;k<=sum;k++){p[k]|=p[k-a[i].v*j];}}}sum=0;for(int i=1;i<=m;i++){cin>>b[i].v>>b[i].c;sum+=b[i].v*b[i].c;}for(int i=1;i<=m;i++){for(int j=0;j<=b[i].c;j++){for(int k=b[i].v*j;k<=sum;k++){q[k]|=q[k-b[i].v*j];}}}int flag=0;for(int i=c;i<=50000;i++){if(p[i]==1&&q[i-c]==1){flag=1;break;}}if(flag) printf("YES\n");else printf("NO\n");}}

然后有一道类似的可以使用背包+贪心做的题。
Codeforces Round #637 (Div. 2) -D
题意大概就是,一段LED段有些块坏了,你现在只能且必须修好其中k个块,不多不少。问修好之后最大能显示最大的数是多少。
思路:也是可以转化成背包存在性的问题。对于每一个LED,我们对其可以修改到的数字进行判断,比如0->8消耗1,1->7消耗1,当然有些情况是不能修改的,比如1->5这样的,对每一个LED求完之后就可以转化为背包问题了:
从后往前dp,看能否dp[0] [0] == 1。如果为0,则肯定不存在这样的背包,出-1。如果存在的话,从前往后从9-0的优先顺序看符合的情况。所以本质上,类似对背包的路径取优。
为什么不是从前往后dp :我们最后的贪心取法是从前往后取,从后往前的dp才是符合背包的通路的(证明当前点肯定可以到达末点)

dp状态:dp [i] [j] 指是否存在到第 i 个片段,花费 j 的情况
dp转移:dp[i] [j-cnt] |= dp[i+1] [j];

#include <iostream>
#include <cstdio>
#include <string.h>
#include <math.h>
#include <queue>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#define ll long long
#define Inf 0x3f3f3f3f
using namespace std;
const int maxn=2e3+5;
int n,k;
string t[10]={"1110111", "0010010", "1011101", "1011011", "0111010", "1101011", "1101111", "1010010", "1111111", "1111011"
};
string s[maxn];
struct node{int cost,v;
};
vector<node>g[maxn];
int dp[maxn][maxn];
int main()
{cin>>n>>k;//for(int i=0;i<n;i++) cin>>s[i];for(int i=0;i<n;i++){cin>>s[i];for(int j=9;j>=0;j--){int cnt=0,flag=1;for(int k=0;k<7;k++){if(s[i][k]=='1'&&t[j][k]=='0'){flag=0;break;}cnt+=(s[i][k]=='0'&&t[j][k]=='1');}if(flag) g[i].push_back({cnt,j}); }}//初始值置1dp[n][k]=1;for(int i=n-1;i>=0;i--){for(int j=0;j<g[i].size();j++){int cnt=g[i][j].cost,val=g[i][j].v;for(int p=cnt;p<=k;p++){dp[i][p-cnt]|=dp[i+1][p];}}}if(!dp[0][0]){printf("-1\n");return 0;}int cnt=0;//贪心-从9-0的顺序取最优解for(int i=0;i<n;i++){for(int j=0;j<g[i].size();j++){if(cnt+g[i][j].cost>k) continue;if(dp[i+1][cnt+g[i][j].cost]){printf("%d",g[i][j].v);cnt+=g[i][j].cost;break;}}}printf("\n");return 0;
}

欠债还钱、Codeforces Round #637 (Div. 2) -D(多重背包)相关推荐

  1. Codeforces Round #637 (Div. 2) - Thanks, Ivan Belonogov! B.Nastya and Door

    题目链接 On February 14, Denis decided to give a Valentine to Nastya and did not come up with anything b ...

  2. Codeforces Round #637 (Div. 2) - Thanks, Ivan Belonogov! C. Nastya and Strange Generator

    题目链接 Being upset after this behavior of Nastya, Denis was very sad. Nothing could make the rejected ...

  3. Codeforces Round #637 (Div. 2) C. Nastya and Strange Generator 题解(阅读理解+简单思维)

    题目链接 题目大意 真难读 问给定的序列能不能用题中所给的算法生成. 比如,题目中举的例子:原序列a: [ 2 3 * * 1 ],先得出 r 数组 [ 3, 3 ,3 ,4 , * ] .r 数组的 ...

  4. Codeforces Round #637 (Div. 2) - Thanks, Ivan Belonogov! D. Nastya and Scoreboard题解(记忆化搜索)

    题目链接 题目大意 一个n个数码位的分数板,每一个数码位都是一个七段数码管,现在给出每个数码位的显示情况,问再点亮k段数码管的话能显示的最大的数是多少,如果不能构成一串数字,就输出-1.答案允许有前导 ...

  5. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  6. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  7. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  8. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  9. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

最新文章

  1. 又踩到Dubbo的坑,但是这次我笑不出来
  2. R语言ggplot2可视化左对齐两个可视化图像的画图区域(边缘)实战
  3. [HNOI2008]Cards
  4. python机器学习入门(Day11:ANN)
  5. Ansible — Playbooks
  6. 分享一些简单的删查改sql语句
  7. CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)...
  8. css 幻灯片_如何使用HTML,CSS和JavaScript创建幻灯片
  9. 使用 .NET 平台,如何玩转 Universal Windows 应用? 1
  10. 线索二叉树 - 数据结构和算法48
  11. 45. Element isDefaultNamespace() 方法
  12. 链式存储结构的线性表
  13. 一文读懂自学机器学习的误区和陷阱(附学习资料)
  14. 二维树状数组--hdu1892
  15. 对话,对话,全是超级爆笑对话
  16. Log4j2配置SMTP邮件实现邮件发送
  17. 基于verilog实现的VGA
  18. 顶会竟然攀比起了拒稿率?教授发文怒斥「挑刺式审稿」
  19. finally关键字
  20. 小友VUI SDK 初探

热门文章

  1. Linux下解压tar.xz文件
  2. js 下载excel
  3. Python基于Django的汽车销售网站
  4. AWS CloudFront实现动静分离架构
  5. 适合刚学js小白熟悉运算符的一个小页面
  6. tomcat完美实现在线商城应用部署
  7. 视频号直播间如何设置?
  8. 解决.bat文件双击后以文本打开的问题
  9. 前端微信签名验证工具_微信JSSDK签名
  10. 用VC6.0开发来电显示软件