poj1837 Balance

Topic Links

Topic meaning:有一天平其左右臂长为15,有m个数字,一个数字表示天平上一个钩子距天平中心点的距离,左边为负数,右边为正数,有n个质量确定的砝码,所有砝码都应被悬挂上去,一个钩子可以挂多个砝码,问有多少种挂法使得天平保持平衡;

Method of Solving:分组背包

每个砝码可以悬挂的位置为一组,dp[i][j]表示前i个砝码使得天平左右力量之差为j的方案数,由于j不能为负数在结合题目条件,故将j增大3000,即dp[0][3000]为悬挂0个砝码时左右力量之差为0,可得其方案数为1

所以dp[i][j]是用第i个砝码与第k个钩子的组合

状态转移方程:dp[i][j]=dp[i][j]+dp[i-1][j+a[i]*c[k]];

#include<iostream>
using namespace std;
int n,m,c[25],a[25],dp[25][6005];
int main(){
    cin>>m>>n;
    for(int i=1;i<=m;i++) cin>>c[i];
    for(int i=1;i<=n;i++) cin>>a[i];
    dp[0][3000]=1;
    for(int i=1;i<=n;i++)
    for(int j=6000;j>=0;j--)
    for(int k=1;k<=m;k++)
      dp[i][j]=dp[i][j]+dp[i-1][j-c[k]*a[i]];
    cout<<dp[n][3000]<<endl;
return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/WELOTX/p/11394128.html