hdu_2191多重背包
用二维数组解的,因为忘了memset害我wa了好几发。。。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int dp[120][120]; int v[120],w[120],num[120]; int maxn(int a,int b,int c) { return max(a,max(b,c)); } void solve() { for(int i=0;i<n;i++) for(int j=0;j<=m;j++) for(int k=0;k<=num[i];k++) { if(j-k*w[i]<0) dp[i+1][j]=maxn(dp[i][j],dp[i+1][j],dp[i+1][j-1]); else { dp[i+1][j]=maxn(dp[i+1][j-1],dp[i][j],dp[i+1][j]); dp[i+1][j]=max(dp[i+1][j],dp[i][j-k*w[i]]+k*v[i]); } } cout<<dp[n][m]<<endl; } int main() { int t; cin>>t; while(t--) { memset(dp,0,sizeof(dp)); cin>>m>>n; for(int i=0;i<n;i++) scanf("%d%d%d",&w[i],&v[i],&num[i]); solve(); } return 0; }