zoukankan      html  css  js  c++  java
  • poj 1837 Balance

    题目

    题意:有一个类似天平的东西,左右两边臂长各15,然后给你一些臂上的挂钩和砝码,问把所有砝码放上去后天平达到平衡的的状态有多少种方案?

    input: 

     C G     //挂钩个数  砝码个数       C (2 <= C <= 20) and the number G (2 <= G <= 20); 

    C个数  //挂钩位置(负数代表在平衡点左边)

    G个数  //砝码重量                         ascending order numbers in the range 1..25 representing the weights' values

    dp[i][j]:表示就把前i个物品全部挂上时使天平达到平衡度为j的状态有多少种方案,这个平衡度j 与臂长和砝码重量有关。

    力臂=重量 *臂长 

    因此最极端的平衡度是所有物体都挂在最远端,因此平衡度最大值为j=15*20*25=7500。原则上就应该有dp[ 1~20 ][-7500 ~ 7500 ]。但是下标不能为负数,所以我们设dp[][7500]为平衡点,范围取到dp[][15000];

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int dp[21][15500];
    /*dp[i][j]表示就把前i个物品全部挂上时
    使天平达到平衡度为j的状态有多少种方案*/
    
    int main()
    {
        int c,g;//挂钩数、砝码个数
        int xc[21],xg[21];//挂钩位置和砝码重量
        cin>>c>>g;
        for(int i=1;i<=c;i++)
            cin>>xc[i];
        for(int i=1;i<=g;i++)
            cin>>xg[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])
                for(int k=1;k<=c;k++)//枚举挂钩
                    dp[i][j+xg[i]*xc[k]]+=dp[i-1][j];
        }
        cout<<dp[g][7500]<<endl;
        return 0;
    }
    
  • 相关阅读:
    Sonar安装与使用说明
    oracle物化视图使用+hibernate
    CAS实现SSO单点登录原理(转)
    冒泡事件通用解法
    百度网盘搜索
    (转)mvn clean install 与 mvn install 的区别(为啥用clean)
    初识Channel
    Java 重入锁 ReentrantLock
    多线程之Future模式
    一天一个类--NIO 之Buffer
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160135.html
Copyright © 2011-2022 走看看