POJ1837 Balance 分组背包

来源:互联网 发布:知乎 vmwarehorizon 编辑:程序博客网 时间:2024/06/05 05:32

题目链接:poj19837

题目大意:有一个天平两臂各挂一些钩子, 每个钩子下面可以挂一些砝码, 问在使用所有的砝码的情况下有多少种方法可以使天平平衡

思路:该问题可以转化成分组背包的问题,大体如下对于每一种砝码来说我们可以关在任意一个钩子下面,这些事件是互斥的,一个砝码一个组进行分组背包即可,注意的是有负的力矩的存在, 因此我们将坐标轴移动到10000即可,代码如下。

注意的就是:这里平衡即两边的力矩相同 即每个砝码的力矩=距离*重量

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int dp[25][20000];//前者是个数  后者能到达的力矩  10000为平衡位置  这个数组记录是方法数int pos[25],w[25];int main(){int c,g;while(~scanf("%d%d",&c,&g)){for(int i=1;i<=c;i++)scanf("%d",&pos[i]);for(int i=1;i<=g;i++)scanf("%d",&w[i]);memset(dp,0,sizeof dp);dp[0][10000]=1;for(int i=1;i<=g;i++){for(int j=0;j<20000;j++){for(int k=1;k<=c;k++){int tp = w[i]*pos[k];//力矩                    if(j-tp>=0&& dp[i-1][j-tp])                        dp[i][j] += dp[i-1][j-tp];}}}printf("%d\n", dp[g][10000]);}    return 0;}


原创粉丝点击