1 8 2 2 100 4 4 100 2
400
依旧不知道自己之前那个是咋错的==
果然还是拆成独立的函数容易看出错误==
/*************** 2015.11.2 hdu2191 ***************/ #include <iostream> #include<cstdio> #include<cstring> using namespace std; int dp[1050],c[1050],w[1050],m[1050]; int n,M,t; void zeropack(int cost,int weight) { for(int i=n;i>=cost;i--) dp[i]=max(dp[i-cost]+weight,dp[i]); } void completepack(int cost,int weight) { for(int i=cost;i<=n;i++) dp[i]=max(dp[i-cost]+weight,dp[i]); } void multipack(int cost,int weight,int num) { if(num*cost>=n) { completepack(cost,weight); return; } int k=1; while(k<num) { zeropack(k*cost,k*weight); num-=k; k*=2; } zeropack(cost*num,weight*num); } int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&M); for(int i=1;i<=M;i++) scanf("%d%d%d",&c[i],&w[i],&m[i]); memset(dp,0,sizeof(dp)); for(int i=1;i<=M;i++) { multipack(c[i],w[i],m[i]); } printf("%d\n",dp[n]); } return 0; }另外 如图 d=====( ̄▽ ̄*)b
我也是醉了