现在的位置: 首页 > 综合 > 正文

九度题库 (题目1462:两船载物问题)

2013年12月03日 ⁄ 综合 ⁄ 共 838字 ⁄ 字号 评论关闭

原题地址

http://ac.jobdu.com/problem.php?pid=1462

附上启发我的大神作品

原题:

http://acm.hdu.edu.cn/showproblem.php?pid=1864

解析:

http://www.cnblogs.com/aiyite826/archive/2010/07/23/1783859.html

题目描述:

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

输入:

输入包含多组测试数据,每组测试数据由若干行数据组成。
第一行为三个整数,n c1 c2,(1 <= n <= 100),(1<=c1,c2<=5000)。
接下去n行,每行一个整数,代表每个物品的重量(重量大小不大于100)。

输出:

对于每组测试数据,若只使用这两艘船可以装下所有的物品,输出YES。
否则输出NO。

样例输入:
3 5 8
6
3
3
3 5 8
5
3
4
样例输出:
NO
YES
/*
*这次组织的考试算是被狂虐了,这题本来真是该会的,只是由于一直纠结于双塔问题,导致思路不通
*/
#include <stdio.h>
#include <string.h>
int list[101];
int dp[5001];
int main(){
	int n, c1, c2, sum, i;
	while(~scanf("%d%d%d", &n, &c1, &c2)){
		sum = 0;
		for(i = 1; i <= n; i++){
			scanf("%d", &list[i]);
			sum += list[i];
		}
		memset(dp, 0, sizeof(dp));//初始化dp = 0
		for(i = 1; i <= n; i++)
			for(int j = c1; j >= list[i]; j--)
				dp[j] = dp[j] >= dp[j - list[i]] + list[i] ? dp[j] : dp[j - list[i]] + list[i];
				//寻找在装在j,前i块重物中能容纳的最大,此处有点不容易理解
		puts(dp[c1] + c2 >= sum ? "YES" : "NO");
	}
	return 0;
}

抱歉!评论已关闭.