原题地址
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;
}