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. Harmonic Number(调和级数+欧拉常数)
  2. 前端文章精选- 收藏集 - 掘金
  3. centos6.6安装python2.7
  4. python内置函数用来打开或创建文件_2020年《python程序设计》基础知识及程序设计598题XS[含参考答案]...
  5. python注入点查找_sqlmap常用注入点检测爆破命令
  6. JDK1.8源码下载及获取、导入IDEA阅读、配置JDK源码
  7. 2016年1月书单推荐
  8. 《算法图解》——二分查找
  9. 互联网金融的前世、今生和未来-系列三(今生):一场跨界的战争
  10. 实验1 VLAN负载均衡
  11. VS 2017番茄插件安装破解教程:visual assist
  12. 微信公众号迁移流程参考
  13. 为软件简单加密的小程序,附源码
  14. 雷达模块感应技术,智能照明LED灯的应用,5.8G雷达感应模块
  15. web 打印实用控件 lodop
  16. Qt之表格输入内容限制方法示例
  17. dBm、mw、dB三者之间的关系
  18. AOZ8902CIL 瞬态电压二极管,设计用于电路保护。
  19. 计算机起始时间1970
  20. windows环境下利用python进行CGI配置

热门文章

  1. Pandas之iloc、loc
  2. linux中gzip和gunzip命令的用法
  3. 机试记不住头文件_朱兆祺教你如何攻破C语言学习、笔试与机试的难点
  4. 矩阵与高斯消元【矩阵乘法,高斯消元求线性方程组,求行列式】 全网最详,附例题与姊妹篇 一万三千字详解
  5. 理解overflow
  6. CSUST - 2021 组队选拔赛
  7. AutoCAD .Net 用代码创建菜单
  8. PHP等级水平评定标准
  9. 基于百度智能云的语音控制系统
  10. Python覆盖率工具