九度 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; }

 

你可能感兴趣的:(问题)