• 【个人训练】(POJ1837)Balance


    这几天抓住国庆的黄金时间(因为没有女朋友,天天刷题emmmm 其实还在肝少前还要捞秋刀鱼) ,重点攻克掉几个基本的地方:搜索、dp、图论。这几天的题目应该就是这些范围。

    题意

    原题的意思大概是这样的,有个天平,上面一堆挂钩,然后一堆砝码,砝码挂在挂钩上面,问平衡的情况有几种。

    分析

    显然不能穷举,因为O(2020)的复杂度太高了。我们不妨换个思路想:在我们放上一个砝码的时候,究竟发生了什么?
    我们可以放在任何一个挂钩上,有c个决策。他们产生了什么影响?我们采取第ci个挂钩放置第i个物品时,令我们从k1个物品产生力臂和为x状态转移到了k个物品产生力臂和为x+ci×wi状态上去。由此,我们得到了这样的一个状态转移方程:(上下符号不统一)
    dp[i][j+c[i]×g[k]]=dp[i1][j]
    说的应该还是有些啰嗦,以后再改吧,唉。。。

    代码

    这份代码基本上和网上另外一个dalao是一样的,因为跟着ta的思路走的。太菜了啊,唉。。。。

    #include <cstring>
    #include <algorithm>
    #include <iostream>
    #include <queue>
    #include <set>
    #include <map>
    #include <vector>
    using namespace std;
    
    typedef unsigned long long ull;
    int rep[24],val[24];
    int dp[25][15005];
    int main()
    {
        int c,g;
        while(cin>>c>>g)
        {
            for(int i=1;i<=c;++i) cin>>rep[i];
            for(int i=1;i<=g;++i) cin>>val[i];
            memset(dp,0,sizeof(dp));
            dp[0][7500]=1;
            for(int i=1;i<=g;++i)
                for(int j=1;j<=15000;++j)
                    if(dp[i-1][j])
                        for(int k=1;k<=c;++k)
                            dp[i][j+val[i]*rep[k]]+=dp[i-1][j];
            cout<<dp[g][7500]<<endl;
        }
        return 0;
    }
    如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。
  • 相关阅读:
    return关键字
    类的成员之二 :方法
    面向对象(一)
    正则表达式(一)
    Linux FTP服务器vsftpd介绍与软件包安装
    Linux SSH
    Linux telnet
    Linux firewalld
    Linux iptables nat表的使用
    Linux iptables规则的基本使用
  • 原文地址:https://www.cnblogs.com/samhx/p/9652108.html
Copyright © 2020-2023  润新知