poj 1837 Balance (01背包)
来源:互联网 发布:编程数学 编辑:程序博客网 时间:2024/04/30 12:34
题意:有一个两臂长15的天平上有n个钩子,现在有g个不同质量砝码。
用上所有的砝码使天平平衡有多少种方法。
分析:关键在于怎么样选择状态才好表示状态转移。
dp[i+w[i]*pos[k]]][j]表示用了i个砝码达到平衡度为j有多少种方法。
dp[i+w[i]*pos[k]][j]=sum(dp[i-1][j])
由于距离c[i]的范围是-15~15,钩码重量的范围是1~25,钩码数量最大是20
因此最极端的平衡度是所有物体都挂在最远端,因此平衡度最大值为j=15*20*25=7500。原则上就应该有dp[ 1~20 ][-7500 ~ 7500 ]。
因此为了不让下标出现负数,做一个处理,使使得数组开为 dp[1~20][0~15000],则当j=7500时天枰为平衡状态
具体分析请参见:http://blog.csdn.net/lyy289065406/article/details/6648094
#include<cstdio>#include<iostream>#include<cstring>using namespace std;int dp[25][15005];int w[25],pos[25];int main(){ int n,g; while(scanf("%d%d",&n,&g)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&pos[i]); for(int i=1;i<=g;i++) scanf("%d",&w[i]); memset(dp,0,sizeof(dp)); dp[0][7500]=1; for(int i=1;i<=g;i++) { for(int j=0;j<=15000;j++) { if(!dp[i-1][j]) continue; //如果这个状态还未统计方法数 for(int k=1;k<=n;k++) //选择一个位置 dp[i][j+pos[k]*w[i]]+=dp[i-1][j]; } } printf("%d\n",dp[g][7500]); } return 0;}
0 0
- poj 1837 Balance(01背包)
- poj 1837 Balance--01背包
- poj 1837 Balance 01背包
- poj 1837 Balance (01背包)
- poj 1837 Balance (01背包)
- POJ 1837 Balance(01背包)
- POJ 1837 Balance (01背包)
- POJ 1837-Balance(01背包)
- POJ-1837-Balance -01背包
- POJ 1837 Balance(01背包)
- POJ 1837 Balance 01背包
- POJ Balance 1837(01背包)
- POJ 1837 Balance 【01背包】
- POJ 1837:Balance(01背包)
- POJ 1837 Balance (01背包)
- poj 1837 Balance(背包)
- POJ Balance (01背包)
- poj 1837 Balance(01背包)
- 拦截导弹
- UVALive 4527 Vaccination Centers 搜索+剪枝
- 同一张表不同SESSION相互持有对方记录引发的死锁
- LeetCode OJ:Text Justification
- 蛇年最后一篇以及新春之礼:高效开发视频讲座下载
- poj 1837 Balance (01背包)
- hdu 1754 I Hate It(树状数组 | 线段树)
- 10个调试和排错的小建议
- 【命令模式-Command】
- 【转】学习鞭策及方向指南
- 修改2张表不同SESSION相互持有记录引发的死锁
- “文件或目录损坏且无法读取”的解决方法
- oc的set方法内存管理
- ssh只允许指定的用户登陆