POJ 1837 Balance (简单DP)
2015-10-05 14:06
405 查看
题目大意
一架天平,天平上有m个钩子,有n个砝码(2 <= c <= 20,2 <= G <= 20),天平的坐标范围为[-15,15]。给出m个钩子的坐标c[i](-15<=c<=15),以及n个砝码的重量g[j](1 <= g <= 25),要求所有砝码都要用到,求最终平衡的方案数
分析
dp[i][j] 表示对于前i个砝码,在平衡度为j时的方案数最大平衡度maxn = 15 * 20 * 25 = 7500。即[-7500,7500],为了方便处理,右移7500,即[0,15000]。所以平衡度为7500时,天平保持平衡。
对于每个砝码都有m种方法,所以时间复杂度为O(m*n*V)。V为最大平衡度,即15000
状态转移方程: dp[i][j+g[i]*c[k]] += d[i-1][j],初始化dp[0][7500] = 1。
代码
#include <iostream> #include <cstring> using namespace std; const int maxn = 15000; int dp[30][maxn+10]; //dp[j]表示前i个砝码,在平衡度为j时的方案数 int c[maxn] , g[maxn]; int main() { int m , n; while(cin >> m >> n) { for(int i = 1; i <= m; i++) cin >> c[i]; for(int i = 1; i <= n; i++) cin >> g[i]; memset(dp , 0 , sizeof(dp)); dp[0][7500] = 1; //两边都不放砝码时 //dp[i][j+c*g] += dp[i][j] for(int i = 1; i <= n; i++) for(int j = maxn; j >= 0; j--) if(dp[i-1][j]) { for(int k = 1; k <= m; k++) { dp[i][j+c[k]*g[i]] += dp[i-1][j]; //cout << "dp[" << i << "]" << "[" << j+c[k]*g[i] << "] = " << dp[i][j+c[k]*g[i]] << endl; } } cout << dp [7500] << endl; } return 0; }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow
- zoj3605 Find the Marble(三维dp)
- Word Break I,II, Triangle,Palindrome Partitioning 动态规划 DP