POJ 1837 Balance(DP)
2016-10-17 21:04
357 查看
题目:POJ 1837 Balance
题意:给一个天平,天平的左右臂长都为15,现在给c个挂钩位置和g个质量的勾码,求有几种方式放勾码可以使天平保持平衡。
解析:用到DP,所以要先弄清DP中的i和j是干什么用的,i的作用是用于存用了几个勾码,j的作用是用于存状态,比如都放在一边的头上,就是最大的之15*20*20=6000,
当j=6000时处于平衡,所以要开6000*2=12000的数组,状态转移方程是dp[i][j+c[i]*g[k]]+=dp[i-1][j],意思是dp[i][j]等于前一个加下一个位置放上所有可能的勾码。
题意:给一个天平,天平的左右臂长都为15,现在给c个挂钩位置和g个质量的勾码,求有几种方式放勾码可以使天平保持平衡。
解析:用到DP,所以要先弄清DP中的i和j是干什么用的,i的作用是用于存用了几个勾码,j的作用是用于存状态,比如都放在一边的头上,就是最大的之15*20*20=6000,
当j=6000时处于平衡,所以要开6000*2=12000的数组,状态转移方程是dp[i][j+c[i]*g[k]]+=dp[i-1][j],意思是dp[i][j]等于前一个加下一个位置放上所有可能的勾码。
#include <iostream> #include <string.h> using namespace std; int dp[21][12001]; int main() { int n, m, i, j, k; int c[21], g[21]; while(cin>>n>>m) { memset(dp, 0, sizeof(dp)); for(i=1; i<=n; i++) { cin>>c[i]; } for(i=1; i<=m; i++) { cin>>g[i]; } dp[0][6000]=1;//一个勾码也不放时,处于平衡状态 for(i=1; i<=m; i++)//每放一个勾码时,访问寻找已经达到平衡的一个点,并且让这个位置放一遍所有的勾码,即:dp[i][j]=sum(c[i]*g[k]); { for(j=0; j<=12000; j++) if(dp[i-1][j]) { for(k=1; k<=n; k++) { dp[i][j+c[k]*g[i]]+=dp[i-1][j]; } } } cout<<dp[m][6000]<<endl; } return 0; }
相关文章推荐
- poj_1837 Balance( 線性DP模型 )
- 记忆化搜索(DP)—— Balance (POJ 1837)
- poj 1837 Balance(DP 01背包)
- poj - 1837 - Balance(dp)
- POJ 1837 Balance - (DP)
- poj 1837 Balance (dp 01背包)
- poj 1837 Balance(DP 01背包)
- POJ 1837 Balance(DP)
- POJ 1837 Balance(01背包变形, 枚举DP)
- poj-1837 Balance【dp】
- POJ 1837 Balance(DP)
- POJ 1837 Balance(二维DP)
- POJ 1837 Balance(DP)
- poj1837--Balance(dp:天平问题)
- POJ 1837 Balance(DP)
- POJ 1837 C - Balance(01背包)(dp)
- POJ 1837 Balance(DP动态规划)
- [poj 1837]Balance dp,01背包
- POJ 1837 Balance 基础DP
- poj 1837 Balance (dp,01背包)