poj 1837
2015-10-23 13:12
302 查看
题目链接:http://poj.org/problem?id=1837
题目大意:
有一个天平,左臂右臂各长15,然后给出n,m,n代表有几个挂钩,挂钩给出负数代表在左臂的距离,正数则在右臂
m代表有m个砝码,要你求出使得这个天平保持平衡有几种方法,要求所有砝码全部使用完
思路:首先我们先要明确dp数组的作用,dp[i][j]中,i为放置的砝码数量,j为平衡状态,0为平衡,j<0左倾,j>0右倾,由于j作为下标不能是负数,所以我们要找一个新的平衡点,因为15*20*20 = 7500,所以平衡点设置为7500,
然后我们可以得出动态方程 dp[i][j+w[i]*c[k]]+=dp[i-1][j];
题目大意:
有一个天平,左臂右臂各长15,然后给出n,m,n代表有几个挂钩,挂钩给出负数代表在左臂的距离,正数则在右臂
m代表有m个砝码,要你求出使得这个天平保持平衡有几种方法,要求所有砝码全部使用完
思路:首先我们先要明确dp数组的作用,dp[i][j]中,i为放置的砝码数量,j为平衡状态,0为平衡,j<0左倾,j>0右倾,由于j作为下标不能是负数,所以我们要找一个新的平衡点,因为15*20*20 = 7500,所以平衡点设置为7500,
然后我们可以得出动态方程 dp[i][j+w[i]*c[k]]+=dp[i-1][j];
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <ctime> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <map> #include <set> #include <string> using namespace std; int dp[25][16000]; int c[25],w[25]; int main() { int n,m,i,j,k; while(scanf("%d %d",&n,&m)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&c[i]); for(j=1;j<=m;j++) scanf("%d",&w[j]); memset(dp,0,sizeof(dp)); dp[0][7500]=1; for(i=1;i<=m;i++) { for(j=0;j<=15000;j++) if(dp[i-1][j]) for(k=1;k<=n;k++) dp[i][j+c[k]*w[i]]+=dp[i-1][j]; } printf("%d\n",dp[m][7500]); } return 0; }
相关文章推荐
- (14)C#ADO.NET 关于MD5加密的登录框
- (15)JavaScrip 的一些简单笔记
- 营销QQ、企业QQ添加在线交谈链接
- surfaceview移动的正玄曲线
- poj 1009 Edge Detection 模拟
- (13)C#ADO.NET 一些小细节
- (12)C#ADO.NET 案例----增删改查的小管理窗口
- (11)C#之ADO.NET 初始三层架构的DAL层
- iOS开发之理解iOS中的MVC设计模式
- 【干货】zookeeper 运营经验分享
- Hadoop集群搭建的密钥配置SSH实现机制
- getRequestURI,getRequestURL的区别
- XShell连接虚拟机Linux
- (10)C#之ADO.NET 数据库中的NULL值的插入与读取
- android 防止按钮连续点击的方法
- spring利用注解进行注入
- linux下shell脚本移动、复制文件笔记
- 利用UIWebView打造一个炫酷的视频背景视图(OC & Swift)
- Python-PyCharm安装numpy和matplotlib
- android卸载指定包名应用