【个人训练】(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发布。
原文地址:https://www.cnblogs.com/samhx/p/9652108.html