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
Sample Output
YES
HINT
wy给了llk一张10元的,llk又给了wy三个1元的

思路:刚开始想用dfs做的,但是太难写了。赛后讨论是个多重背包。考的是dp判定性。

状态定义:dp[i][j]表示前i个种类还钱数为j时候 的合法情况。

状态转移:dp[i][j]=dp[i-1][j-k*v[i]] (k:0~c[i])

和平时的dp有点不一样的是初始赋值1之后然后dp[i][j]为1的就不用转移了。并且要注意转移的条件是j-k*v[i]>=0(要还钱数为正)和j-k*v[i]<=C,我的输入这样做防止越界;

然后具体看代码注释,学校的oj容易Tle

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=150;
typedef int  LL;//要int,不然T
LL dp[maxn][10010];
LL v[maxn];
LL c[maxn];
int main(void)
{std::ios::sync_with_stdio(false);cin.tie(0);LL C,n,m;while(cin>>C>>n>>m){memset(dp,0,sizeof(dp));for(LL i=1;i<=n;i++)cin>>v[i]>>c[i];for(LL i=n+1;i<=n+m;i++){cin>>v[i]>>c[i];v[i]=-v[i];   }    dp[0][0]=1;for(LL i=1;i<=n+m;i++)for(LL j=0;j<=C;j++)//如果硬要j<=10000,把j和k的循环换一下,不然就T了 for(LL k=0;k<=c[i];k++)/// {if(dp[i][j]) continue;//已经是1的别更新了 if(j-k*v[i]>=0&&j-k*v[i]<=C)//v[i]会是个负数,<=C,不然可能超内存 dp[i][j]=dp[i-1][j-k*v[i]];}if(dp[n+m][C]) cout<<"YES"<<endl;else cout<<"NO"<<endl;  }
return 0;
}

上面的码有点问题..但是Oj的数据比较emmm居然过了.问了几个人说背包优化后T了没优化没有T,几个人交流了一下数据可能有问题.修正代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
typedef long long ll;
using namespace std;
const   int N=110;
int dp[N][50010];
int v[N];
int c[N];
int main()
{int C,n,m;while(scanf("%d%d%d",&C,&n,&m)!=EOF){for(int i=1;i<=n+m;i++)for(int j=0;j<50010;j++)dp[i][j]=0;int sum=C;for(int i=1;i<=n;i++){scanf("%d%d",&v[i],&c[i]);sum+=v[i]*c[i];}for(int i=n+1;i<=n+m;i++){scanf("%d%d",&v[i],&c[i]);v[i]=-v[i];}dp[0][0]=1;for(int i=1;i<=n+m;i++)for(int k=0;k<=sum;k++)for(int j=0;j<=c[i];j++){if(dp[i][k]) break;if(k-j*v[i]>=0&&dp[i-1][k-j*v[i]]){//     cout<<i<<' '<<k<<endl;dp[i][k]=dp[i-1][k-j*v[i]];}}if(dp[n+m][C])  printf("YES\n");else        printf("NO\n");}return 0;
}

Problem D: 欠债还钱 (多重背包)相关推荐

  1. HDU 5445 Food Problem 两次多重背包

    题目描述: Problem Description Few days before a game of orienteering, Bell came to a mathematician to so ...

  2. Java解洛谷P6771 [USACO05MAR]Space Elevator 太空电梯,包含完整的多重背包状态转移方程,大量注释,通俗易懂

    01.题目及链接 题目链接:https://www.luogu.com.cn/problem/P6771 02.多重背包状态转移方程说明 了解多重背包 有 N 种物品和一个容量是 V 的背包,每种物品 ...

  3. hdu5445 Food Problem(多重背包)(*)

    题目链接 Food Problem Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...

  4. [HDU 5445]Food Problem[多重背包]

    题目链接:[HDU 5445]Food Problem[多重背包] 题意分析: 有n种类型的点心,每种提供t的能量,占据u的空间,有v个: 有m种类型的卡车,每种容量x,雇佣花费y,能提供z辆: 点心 ...

  5. hdu 5445 Food Problem (多重背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5445 题解:一看就像多重背包就是怎么看都不好做.但是这里有点明显的就是有两个背包,一个是糖 ...

  6. HDU 5445 Food Problem 多重背包+二进制优化

    据说也可以用单调队列优化多重背包,但是我不会,所以还是选择了二进制优化... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:先给n,m, ...

  7. HDU 5445 Food Problem(多重背包)

    Description n种点心,每种点心有一定的能量t,体积u和数量v,现在要用m种卡车搬运这些点心,每种开车有一定的容量x,花费y和数量z,点心可以分割但选一块就要都选,现在问将运送总能量不小于p ...

  8. Hdu 5445 Food Problem 多重背包

    题意:给出n,m,p,分别表示有n种点心,m种卡车,能量p. 然后给出每种点心所能获得的能量,所占卡车的体积,以及每种点心的数量. 再给出每种卡车所能装下的空间,租这种卡车的费用,以及每种卡车的数量. ...

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

    Description llk经常和wy一起去yh小饭馆吃盖浇饭,一天他们吃完后llk把两个人的钱一起付了,但是wy不想欠llk的钱.现在wy手中有一些散钱,llk手中也有一些散钱,wy想知道能不能刚 ...

最新文章

  1. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(改变分组次序)实战
  2. mysql between and 包含边界吗_MySQL | SQL语法(一)
  3. ie浏览器怎样查看html,查看IE浏览器历史记录的方法
  4. 每天一个linux命令(58):telnet命令
  5. 思维题 UVA 10881 Piotr's Ants
  6. top 命令_Linux监控cpu以及内存使用情况之top命令
  7. linux 服务器(CentOS7)搭建PHP环境+SSH配置+服务器文件上传配置
  8. C++—— cin输入流详解
  9. 18、led驱动程序的实现
  10. python 0xa_python在获取字节0xa或0xd后停止对文件的二进制读取
  11. 算法笔记_072:N皇后问题(Java)
  12. MBlock开发环境搭建
  13. 解决 IIS 部署网站引用 woff/woff2/svg 字体报 404 错误
  14. 人生进度条百分之20_1分钟get技能:缺了“进度条”,你注定和80%的失败者一样实现不了人生目标...
  15. Lagrange Multiplier Theorem——候选人定理
  16. MySQL死锁解决之道
  17. 课得软件丨纵观全球程序员税后年收入,中国排在第几?
  18. 实战1 - 空气质量数据的校准
  19. java设计模式 (二) 创建模式
  20. 网络基础:套接字编程,UDP和TCP通信程序

热门文章

  1. Linux服务器开发,定时器方案红黑树,时间轮,最小堆
  2. CS+ FDL库函数相关
  3. c语言 n阶阶乘尾0个数,计算n的阶乘(n!)末尾0的个数
  4. 【机智云物联网低功耗转接板】+模拟MCU快速上手
  5. 群聊私聊天建群社交即时通讯H5系统开发
  6. Speeding Up Deep Learning Inference Using TensorRT
  7. 低温烧结银--功率半导体器件封装的幕后英雄
  8. Django的关系映射
  9. zencart修改产品默认图片路径
  10. PHP单元测试利器:PHPUNIT初探