问一下大家,能不能把dp数组压到一维(可以另开数组,或把其中一维压到0/1等等qwq
下面是我的代码,注释掉的是一个错误的压维tot
/* 空间O(n^2) */
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,t,m,a[22],dp[22][22],ans;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>t>>m;
for(ll i=1;i<=n;i++) cin>>a[i];
for(ll i=1;i<=m;i++)
{
for(ll j=1;j<=n;j++)
{
for(ll k=1;k<=t;k++) dp[j][0]=max(dp[j][0],dp[j][k]);
for(ll k=1;k<=t;k++)
{
dp[j][k]=max(dp[j][k],dp[j-1][k]);
if(k>=a[j]) dp[j][k]=max(dp[j][k],dp[j-1][k-a[j]]+1);
}
}
}
for(ll i=1;i<=t;i++) ans=max(ans,dp[n][i]);
cout<<ans;
return 0;
}
/* 空间O(2n)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,t,m,a[22],dp[22],lst[22],ans;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>t>>m;
for(ll i=1;i<=n;i++) cin>>a[i];
for(ll i=1;i<=m;i++)
{
for(ll j=1;j<=n;j++)
{
dp[0]=lst[j];
for(ll k=t;k>=1;k--) if(k>=a[j]) dp[k]=max(dp[k],dp[k-a[j]]+1);
lst[j]=0;
for(ll k=1;k<=t;k++) lst[j]=max(lst[j],dp[k]);
}
}
for(ll i=1;i<=t;i++) ans=max(ans,dp[i]);
cout<<ans;
return 0;
}
*/