730J:Bottles
简述题意
现在有
n
个瓶子,每个瓶子有容量
问把所有的水转移到尽量少的瓶子,至少需要几个瓶子。
在满足上问的情况下,最少徐璈转移多少单位的水。
数据范围
1≤n≤100
1≤ai≤bi≤100
思路
状态转移方程
f[i][j][k]
表示处理到了第
i
个瓶子,已经选了
状态转移方程:
空间是
O(108)
,类似背包可以压掉一维,但是后面两维的要倒叙枚举。
统计答案随便搞一搞就行了。
最终时间复杂度
O(n4)
空间复杂度
O(n3)
还是比较水的= =
代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,need,sum,ans;
int f[110][10010],a[110],b[110];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
need+=a[i];
}
for (int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
sum+=b[i];
}
memset(f,0xff,sizeof(f));
f[0][0]=0;
for (int i=1;i<=n;i++)
for (int j=n;j>=1;j--)
for (int k=sum;k>=b[i];k--)
if (f[j-1][k-b[i]]!=-1)
f[j][k]=max(f[j][k],f[j-1][k-b[i]]+a[i]);
ans=-1;
for (int j=1;j<=n;j++)
{
for (int k=need;k<=sum;k++)
ans=max(ans,f[j][k]);
if (ans!=-1)
{
printf("%d %d",j,need-ans);
break;
}
}
return 0;
}