newcode
三维:要从头跑到尾,才能把整个dp更新完整,不然dp更新不完整
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,H,S;
ll h[1010],s[1010],w[1010];
ll dp[1005][305][305];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>H>>S;
for(int i=1;i<=n;i++)
cin>>h[i]>>s[i]>>w[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=H;j++)
{
for(int k=0;k<=S;k++)
{
dp[i][j][k]=dp[i-1][j][k];
if(j>h[i]){
if(k>=s[i])
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-h[i]][k-s[i]]+w[i]);
else if(j-h[i]-s[i]+k>0)
dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-h[i]-s[i]+k][0]+w[i]);
}
}
}
}
cout<<dp[n][H][S]<<endl;
return 0;
}
滚动数组优化
相当于01背包,拿和不拿,从高向底循环
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,H,S;
ll h,s,w;
ll dp[305][305];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>H>>S;
for(int i=1;i<=n;i++)
{
cin>>h>>s>>w;
for(int j=H;j>h;j--)
for(int k=S;k>=0;k--)
if(k>=s)
dp[j][k]=max(dp[j][k],dp[j-h][k-s]+w);
else if(j-h-s+k>0)
dp[j][k]=max(dp[j][k],dp[j-h-s+k][0]+w);
}
cout<<dp[H][S]<<endl;
return 0;
}
1.不开ll 嗣
2.不滚动优化 嗣