1. 程式人生 > >SDNUOJ 1061 “兩個重量”

SDNUOJ 1061 “兩個重量”

Description
XXX上山去採藥。XXX有一個最大承重為m(1<=m<=100)且容積為t(1<= t<=100)的揹包,他所採集的藥材的總重量不能大於揹包的最大承重且總體積不能大於揹包的容積。已知共有n(1<=n<=1000)株藥材,並且知道每株藥材的重量w1(1<=w1<=m)、體積w2(1<=w2<=t)及價值v(1<=v<=100000),如何選擇,才能使得采到的藥材的總價值最大?
Input
第1行為三個整數m、t和n,分別為揹包的最大承重、容積及藥材的數量。 第2至n+1行每行三個整數w1、w2和v,分別表示每株藥材的重量、體積及價值。
Output
能採到的藥材的最大總價值
Sample Input
100 100 5
50 60 100
60 50 120
50 50 115
40 60 21
40 50 5
Sample Output
125

在一維0-1揹包基礎上加一維度(討論體積),其與重量寫法無差別,地位平等,0-1揹包稍改造就可以了。

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define N 1005
int v[N], w[N], r[N];
int m[N][N];

int main()
{
    int c, a, n;
    while(cin >> c >> a >> n)
    {
        for(int i = 1; i <= n; i++)
        {
            cin >> w[i] >> r[i] >> v[i];
        }
        memset(m, 0, sizeof(m));
        for(int i = 1; i <= n; i++)
        {
            for(int j = c; j >= w[i]; j--)
            {
                for(int k = a; k >= r[i]; k--)
                    m[j][k] = max(m[j][k], m[j - w[i]][k - r[i]] + v[i]);
            }
        }
        cout << m[c][a] << endl;
    }
    return 0;
}