poj 1837 Balance (dp 01背包)
2013-05-23 09:40
393 查看
题目:点击打开链接
题目大意:
有一个天平,天平左右两边的手臂长度都是15,手臂上面有些位置会有挂钩。还有G个砝码 (1 <= G <= 20),它们重量各不相同,在1~25中取值。
给出C个挂钩,它们的位置在【-15..15】,不会重叠。负号的代表在左边臂,正号的在右边。
要求把所有砝码都放在挂钩上,多个砝码可以挂在同一个挂钩上,问有多少种不同的方案使天平能够平衡?
思路:
天平左臂的力矩和是负数,右边的力矩和是正数,那么左边+右边的力矩之和,如果是正数,代表天平平衡倾向右边,负数代表倾向左边,为0的时候天平是平衡的。我们把 “左边力矩和+右边力矩和”叫做平衡系数
状态f[i][j]代表用前i个砝码,放置成平衡系数为j的时候共有多少种方案。
那么,f[i][j] += f[i-1][j-C[k]*G[i]], {0<=k=<c};
因为平衡系数中有负数的,所以要所有平衡系数往右平移,即加上一个足够大的正数。可以计算出力矩之和最小负数的是把所有砝码都挂在天平-15的位置上,砝码最多20个,取值最大的情况是6...25,那么砝码之和最终为 (6+25)*20/2 = 310, 力矩之和为 -15*310 = 4650
所以加上4650即可,这是位置4650代表的是原来天平的中间位置,
初始化 f[0][4650] = 1, 表示一个砝码都不挂,这是一种平衡的方案。
最终,f[G][4650]就是答案。
PS: 这题最开始我是用滚动数组做的,用G++提交一直RE到死,郁闷。后来改用C++提交就可以AC了。
代码:
题目大意:
有一个天平,天平左右两边的手臂长度都是15,手臂上面有些位置会有挂钩。还有G个砝码 (1 <= G <= 20),它们重量各不相同,在1~25中取值。
给出C个挂钩,它们的位置在【-15..15】,不会重叠。负号的代表在左边臂,正号的在右边。
要求把所有砝码都放在挂钩上,多个砝码可以挂在同一个挂钩上,问有多少种不同的方案使天平能够平衡?
思路:
天平左臂的力矩和是负数,右边的力矩和是正数,那么左边+右边的力矩之和,如果是正数,代表天平平衡倾向右边,负数代表倾向左边,为0的时候天平是平衡的。我们把 “左边力矩和+右边力矩和”叫做平衡系数
状态f[i][j]代表用前i个砝码,放置成平衡系数为j的时候共有多少种方案。
那么,f[i][j] += f[i-1][j-C[k]*G[i]], {0<=k=<c};
因为平衡系数中有负数的,所以要所有平衡系数往右平移,即加上一个足够大的正数。可以计算出力矩之和最小负数的是把所有砝码都挂在天平-15的位置上,砝码最多20个,取值最大的情况是6...25,那么砝码之和最终为 (6+25)*20/2 = 310, 力矩之和为 -15*310 = 4650
所以加上4650即可,这是位置4650代表的是原来天平的中间位置,
初始化 f[0][4650] = 1, 表示一个砝码都不挂,这是一种平衡的方案。
最终,f[G][4650]就是答案。
PS: 这题最开始我是用滚动数组做的,用G++提交一直RE到死,郁闷。后来改用C++提交就可以AC了。
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #define SQ(x) ((x)*(x)) #define MP make_pair const int INF = 0x3f3f3f3f; const double PI = acos(-1.0); typedef long long int64; using namespace std; const int MAXN = 22; const int mid = 4650; int pos[MAXN], w[MAXN]; int f[22][mid*2+10]; int n, m; int main(){ while(~scanf("%d%d", &n, &m)){ for(int i=0; i<n; ++i) scanf("%d", &pos[i]); for(int i=0; i<m; ++i) scanf("%d", &w[i]); memset(f, 0, sizeof(f)); f[0][mid] = 1; for(int i=0; i<m; ++i){ for(int j=0; j<n; ++j){ int add = w[i]*pos[j]; for(int v=mid*2; v-add>=0; --v){ if(v-add <= mid*2) f[i+1][v] += f[i][v-add]; } } } printf("%d\n", f[m][mid]); } return 0; }
相关文章推荐
- poj 1837 Balance(DP 01背包)
- POJ 1837 Balance (DP-01背包)
- poj 1837 Balance(DP 01背包)
- poj 1837 Balance (dp,01背包)
- POJ 1837 C - Balance(01背包)(dp)
- [poj 1837]Balance dp,01背包
- poj 1837 Balance -dp-01背包
- POJ 1837 Balance(01背包应用)
- POJ_1837 Balance (dp)
- POJ 1837 - Balance (dp)
- poj1837-Balance(01背包)
- poj 1837 Balance (01背包)
- POJ 1837 Balance 【01背包】
- poj 1837 Balance (暴力dp)
- POJ 1837 Balance(DP)
- POJ 1837 Balance (DP)
- poj_1837 Balance(01背包)
- POJ 1837 Balance 水题, DP 难度:0
- No.1 DP 背包 POJ 1837 Balance
- POJ 1837 Balance(01背包)