今天联系到了完全背包问题,看了很久的板子,才动的题,最后wr到崩溃。
先分享一下板子
for(int i=0;i<m;i++)
for(int j=0;j<=mon;j++)
{
for(int k=0;k*p[i]<=j;k++)
{
dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*p[i]]+k*h[i]);
}
}
for(int i=0;i<m;i++)
for(int j=0;j<=mon;j++)
{
if(j<p[i])
dp[i+1][j]=dp[i][j];
else
dp[i+1][j]=max(dp[i][j],dp[i+1][j-p[i]]+h[i]);
}
一个两重循环一个三重循环,
题目是hdu 2191;
套板子,二重循环没办法改进(还望大佬指名,三重循环主要是,取每个大米的数量一定,只需价格判断条件k<=num(大米数量即可)
#include <iostream>
#include <cstring>
using namespace std;
long long p[120],h[120],c[120],dp[120][120];
int main(){
int t;
cin>>t;
while(t--)
{ memset(dp,0,sizeof(dp));
int mon,m;
cin>>mon>>m;
for(int i=0;i<m;i++)
cin>>p[i]>>h[i]>>c[i];
for(int i=0;i<m;i++)
for(int j=0;j<=mon;j++)
{
for(int k=0;k*p[i]<=j&&k<=c[i];k++)
{
dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*p[i]]+k*h[i]);
}
}
cout<<dp[m][mon]<<endl;
}
return 0;
}