题意:两个人要搬寝室,两个人都有自己的承受能力A和c,他们有N件物品,如果他们能自己把东西搬完就输出Yes,如果不行,他们可以请一个帮手,一个帮手只能帮拿一件任意重量的物品,但是只能请一个。如果请一个帮手能把东西搬完,输出Need a helper,否则输出No。
做法:排序,然后对前n-1件物品01背包。最后分组讨论。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
int dp[1010],a[1010];
using namespace std;
int main()
{
int A,c;
while(~scanf("%d%d",&A,&c))
{
int n,sum = 0;
scanf("%d",&n);
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&a[i]);
sum += a[i];
}
sort(a,a+n);
memset(dp,0,sizeof(dp));
for(int i = 0 ; i < n-1 ; i++)
{
for(int j = A ; j >= a[i] ; j--)
{
dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
}
}
if(sum - dp[A] <= c) printf("Yes\n");
else if(sum - dp[A] > c && sum - dp[A] - a[n-1] <=c) printf("Need a helper\n");
else printf("No\n");
}
return 0;
}