先预处理一下,就转化成一个把背包装满的问题。。。时间很玄学。。998ms卡过。要多交几次,大概交三次TLE两次吧。。。orz
#include<bits/stdc++.h>
using namespace std;
#define maxn 1001
int dp[1000001];
int t,n,k;char ch;
int arr[maxn];
vector<int> vec;
int main()
{
scanf("%d",&t);
while(t--)
{
vec.clear();
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&arr[i]);
int num = 0;int dd=0;
for(int i=1;i<=n;i++)
{
cin>>ch;
if(ch=='L') num +=arr[i];
if(ch=='D') num -= arr[i];
else
{
vec.push_back(arr[i]);
dd+=arr[i];
}
}
k = abs(k-num);
if(dd<k)
{
puts("no");
continue;
}
fill(dp,dp+k+1,-INT_MAX);
dp[0] = 0;
for(int i=0;i<vec.size();i++)
{
for(int j = k;j>=vec[i];j--)
{
dp[j]=max(dp[j],dp[j-vec[i]]+vec[i]);
}
}
if(dp[k]==k)
puts("yes");
else puts("no");
}
}
该博客主要介绍了HDU 6140题目的解决方案,将原问题转化为求解背包完全填充的问题。由于运行时间的不确定性,作者提到了在实际操作中可能遇到的998ms超时问题,建议多次提交以通过测试。
625

被折叠的 条评论
为什么被折叠?



