zoukankan      html  css  js  c++  java
  • 九度 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;
    }
  • 相关阅读:
    sqlserver添加表、字段注释
    SQL语句增加字段、修改字段、修改类型、修改默认值
    端口概念
    删除数据库数据
    转移数据库表数据
    优化网站
    提高SQL查询效率
    相关方法扩展
    SQL空和NULL的区别
    C#分布式缓存Couchbase使用
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3586984.html
Copyright © 2011-2022 走看看