九度 1462:两船载物问题(01背包)

题目描述:

给定n个物品的重量和两艘载重量分别为c1和c2的船,问能否用这两艘船装下所有的物品。

 

思路

1. 朴素背包问题

2. 有几个细节要好好把握 (1) 在读入物品重量时顺带统计物品的最大值和总重量 (2) 对载重量较小的船计算dp

3. 一维 dp, dp[i] 表示总物品重量为 i 时的最大价值, 因此 dp[i] 是不连续的, 统计结果时需要遍历 dp. 而二维 dp[][] 则可以填满矩阵

 

代码 未通过九度测试

#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;

int n, c1, c2;
int wet[200];
int dp[10000];

int main() {
    while(scanf("%d%d%d", &n, &c1, &c2) != EOF) {
        int totalWeight = 0;
        bool exceed = false;
        
        int biggerone = max(c1, c2);

        for(int i = 0; i < n; i ++) {
            scanf("%d", wet+i);
            totalWeight += wet[i];
            if(wet[i] > biggerone) {
                exceed = true;
            }
        }

        if(exceed) {
            cout << "NO" << endl;
            continue;
        }

        int c = min(c1, c2);

        memset(dp, 0, sizeof(int)*totalWeight);

        for(int i = 0; i < n; i ++) {
            for(int v = c; v >= wet[i]; v --) {
                dp[v] = max(dp[v], dp[v-wet[i]]+wet[i]);
            }
        }

        int carryone;
        for(int i = 0; i <= c; i ++)
            carryone = max(carryone, dp[i]);
        
        if(biggerone >= totalWeight-carryone)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

 

posted @ 2014-03-07 18:17  SangS  阅读(228)  评论(0编辑  收藏  举报