hdu-acm新生赛-智能车
前言
考场上想了半天,用了好多种思路,最后用背包类一维数组加上最大的最小值记忆化求解。
思路
我一开始想的思路,就不说了,直接说我最终解法是怎么得到的。
我想什么时候无法启动智能车,即判断存不存在电池的组合使得刚好达到所需电力?
我的脑海里冒出了暴力搜索,但是显然这种方法不可能。
记忆化搜索?我又试了试,果不其然,超时了。
根据我以往的经验来看,dp比搜索更高效
于是我开始构建dp数组-->轻松完成
如何找出这种搭配方法的最小的电池容量呢?
除去目标值不去计算最小值之外,其余电力计算达到这种搭配的最小值(好难讲)
代码
#include<iostream>
#include<algorithm>
using namespace std;
int a[50005]={0};
int main()
{
int t;
cin>>t;
while(t--)
{
int n,c;
cin>>n>>c;
int dp[505]={1};
int ans=505;
int mins[505]={0};
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
for(int j=c;j>=a[i];j--)
{
if(dp[j-a[i]])
{
if(j==c)
{
ans=min(ans,a[i]-mins[j-a[i]]);
continue;
}
if(j==a[i])mins[j]=a[i];
else
{
if(mins[j])mins[j]=max(mins[j],mins[j-a[i]]);
else mins[j]=mins[j-a[i]];
}
dp[j]=dp[j-a[i]];
}
}
}
if(ans!=505) cout<<ans<<endl;
else puts("-1");
}
return 0;
}

浙公网安备 33010602011771号