IAML's Blog

Find passion in coding
sicily1702 Robot Roll Call -- Cambot...Servo...Gypsy...Croooow
poj3267 The Cow Lexicon

poj1837 Balance

IAmL posted @ 2009年4月20日 07:34 in 解题报告 with tags poj1837解题报告 , 4257 阅读

自从4.11在sysu预选赛充分地感觉到无力之后,有一个多星期患上了赛后综合症,一直不想或者说,逃避编程。经过啊通和龙兄的帮助,终于在一个多星期后的今天重新做了poj的题,也做了sicily的题,总算从阴影中走出。呵呵。只能怪自己太水了,差点就成了:在哪跌倒,就在哪埋了= =。

好了,废话少说,这题的主要难点是找状态存储方法(er,据说所有的dp题都是这样,所以这句有点废= =)。存储方法是m[i][t]表示有i个物品时,总权为t的个数。状态转移方程m[i][t] += m[i-1][j+hook[k]*w[i]],最后只要找出m[g][N]的数目就可以了。

======一般般的分割线======

 

#include <iostream>
using namespace std;

#define N 7500

int m[21][15000];

int main()
{
        int i, j, k, c, g, hook[21], w[21];

        cin >> c >> g;

        for (i = 1; i <= c; i++) cin >> hook[i];
        for (i = 1; i <= g; i++) cin >> w[i];

        //initilize
        memset(m, 0, sizeof(m));

        for (k = 1; k <= c; k++)
                m[1][hook[k] * w[1] + N]++;

        //dp
        for (i = 2; i <= g; i++)
        {
                for (j = 0; j < 2 * N; j++)
                {
                        if (m[i - 1][j] == 0) continue;
                        for (k = 1; k <= c; k++)
                                m[i][j + hook[k] * w[i]] += m[i - 1][j];                       
                }
        }

        cout << m[g][N] << endl;               

        return 0;
}

 

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter