欠债还钱、Codeforces Round #637 (Div. 2) -D(多重背包)
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(多重背包)相关推荐
- 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 ...
- 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 ...
- Codeforces Round #637 (Div. 2) C. Nastya and Strange Generator 题解(阅读理解+简单思维)
题目链接 题目大意 真难读 问给定的序列能不能用题中所给的算法生成. 比如,题目中举的例子:原序列a: [ 2 3 * * 1 ],先得出 r 数组 [ 3, 3 ,3 ,4 , * ] .r 数组的 ...
- Codeforces Round #637 (Div. 2) - Thanks, Ivan Belonogov! D. Nastya and Scoreboard题解(记忆化搜索)
题目链接 题目大意 一个n个数码位的分数板,每一个数码位都是一个七段数码管,现在给出每个数码位的显示情况,问再点亮k段数码管的话能显示的最大的数是多少,如果不能构成一串数字,就输出-1.答案允许有前导 ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- 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 ...
- 构造 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 的例子可以 ...
- Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...
- Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...
最新文章
- 又踩到Dubbo的坑,但是这次我笑不出来
- R语言ggplot2可视化左对齐两个可视化图像的画图区域(边缘)实战
- [HNOI2008]Cards
- python机器学习入门(Day11:ANN)
- Ansible — Playbooks
- 分享一些简单的删查改sql语句
- CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)...
- css 幻灯片_如何使用HTML,CSS和JavaScript创建幻灯片
- 使用 .NET 平台,如何玩转 Universal Windows 应用? 1
- 线索二叉树 - 数据结构和算法48
- 45. Element isDefaultNamespace() 方法
- 链式存储结构的线性表
- 一文读懂自学机器学习的误区和陷阱(附学习资料)
- 二维树状数组--hdu1892
- 对话,对话,全是超级爆笑对话
- Log4j2配置SMTP邮件实现邮件发送
- 基于verilog实现的VGA
- 顶会竟然攀比起了拒稿率?教授发文怒斥「挑刺式审稿」
- finally关键字
- 小友VUI SDK 初探