1 8 2 2 100 4 4 100 2
400
code1:
#include<iostream> #include<cstring> using namespace std; int main() { int cas; cin>>cas; int cost[1000]; int weight[1000]; int amount[1000]; int dp[1000]; int n,m; while(cas--) { cin>>n>>m; for(int i=1;i<=m;i++) { cin>>cost[i]>>weight[i]>>amount[i]; } int sum=-1; memset(dp,0,sizeof(dp)); for(int i=1;i<=m;i++) { for(int j=1;j<=amount[i];j++)//将其按照给定数量转换成0-1背包 { for(int k=n;k>=cost[i];k--) { dp[k]=max(dp[k],dp[k-cost[i]]+weight[i]); // cout<<1<<endl; if(dp[k]>sum) sum=dp[k]; } } } cout<<sum<<endl; } return 0; }
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int main() { int cas; int count; int val[10000]; int wei[10000]; int dp[100000]; int n,m; int p,h,c;//价格 每袋的重量 大米的袋数 cin>>cas; while(cas--) { cin>>n>>m; count=0; memset(dp,0,sizeof(dp)); memset(wei,0,sizeof(wei)); memset(val,0,sizeof(val)); for(int i=0;i<m;i++) { cin>>p>>h>>c; for(int j=0;j<c;j++) { val[count]=p; wei[count++]=h; } } for(int i=0;i<count;i++) { for(int j=n;j>=val[i];j--) { dp[j]=max(dp[j],dp[j-val[i]]+wei[i]); } } cout<<dp[n]<<endl; } return 0; } /* 这是这第三次做这道题 没有用二进制优化 其实直接转换成01 背包 简单实用~ */
01 ,完全,多重背包,一维之后差不多了~ 还省时~