题意:汶川地震买大米
分析:裸多重背包,这题数据比较小所以可以三重循环不需要优化
代码:
#include<iostream>
#include<cstring>
using namespace std;
int dp[1000][1000],t,n,m;
int p[1000],h[1000],c[1000];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
cin>>t;
while(t--){
memset(dp,0,sizeof(dp));
cin>>n>>m;
for(int i=0;i<m;i++) cin>>p[i]>>h[i]>>c[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=c[0];j++)
if(j*p[0]<=i)
dp[0][i]=max(dp[0][i-1],j*h[0]);
for(int i=1;i<m;i++){
for(int j=0;j<=n;j++){
for(int k=0;k<=c[i];k++){
if(j>=k*p[i])
dp[i][j]=max(dp[i][j],dp[i-1][j-k*p[i]]+k*h[i]);
}
}
}
cout<<dp[m-1][n]<<endl;
}
}