题解,先去考虑算法,再去解决时间复杂度的问题
假如一定要选 \(k_1\) 个,瓶子,那么我一定是选 \(sumb\) 尽量大(容量大),且 \(suma\) 也尽量大的(少搬运),那么对于相同的 \(sumb\) 选择 \(suma\) 更大的
所以三维dp,时间复杂度够
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int dp[105][10005];
int a[105],b[105];
void solve()
{
int n;
cin>>n;
int suma=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
suma+=a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
memset(dp,-1,sizeof dp);
dp[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int k=i;k>=1;k--)
{
for(int j=10000;j>=b[i];j--)
{
if(dp[k-1][j-b[i]]!=-1)dp[k][j]=max(dp[k][j],dp[k-1][j-b[i]]+a[i]);
}
}
}
int ans=2e9,num=n;
for(int i=1;i<=n;i++)
{
for(int j=suma;j<=10000;j++)
{
if(i<=num&&dp[i][j]!=-1)
{
num=i;
ans=min(ans,suma-dp[i][j]);
}
}
}
cout<<num<<' '<<ans;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
while(t--) solve();
return 0;
}
标签:Bottles,int,复杂度,dp,suma,105
From: https://www.cnblogs.com/pure4knowledge/p/18308111