蒟蒻吃药计划-治疗系列 #round4 多重背包+混合背包代码存放
1 #include <bits/stdc++.h> 2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i) 3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i) 4 using namespace std; 5 int v[1000+20],w[1000+20],s[1000+20]; 6 int dp[1000+20]; 7 int n,m; 8 inline int botposs(int a,int b,int pd){ 9 if(pd==1) return a>b?a:b; 10 if(pd==0) return a<b?a:b; 11 } 12 int main(){ 13 scanf("%d%d",&n,&m); 14 fp(i,1,n){ 15 scanf("%d%d%d",&v[i],&w[i],&s[i]); 16 } 17 fp(i,1,n){ 18 fd(j,m,0){ 19 fp(k,0,s[i]){ 20 if(j-k*v[i]<0){ 21 break; 22 } 23 dp[j]=botposs(dp[j],dp[j-k*v[i]]+k*w[i],1); 24 } 25 } 26 } 27 printf("%d",dp[m]); 28 return 0; 29 }
1 #include <bits/stdc++.h> 2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i) 3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i) 4 using namespace std; 5 int v[1000+20],w[1000+20]; 6 int dp[1000+20]; 7 int n,m,n1; 8 inline int botposs(int a,int b,int pd){ 9 if(pd==1) return a>b?a:b; 10 if(pd==0) return a<b?a:b; 11 } 12 int main(){ 13 scanf("%d%d",&n,&m); 14 int x,y,s,t=1; 15 fp(i,1,n){ 16 scanf("%d%d%d",&x,&y,&s); 17 while(s>=t){ 18 v[++n1]=x*t; 19 w[n1]=y*t; 20 s-=t; 21 t*=2; 22 } 23 v[++n1]=x*s; 24 w[n1]=y*s; 25 } 26 fp(i,1,n1){ 27 fd(j,m,v[i]){ 28 dp[j]=botposs(dp[j],dp[j-v[i]]+w[i],1); 29 } 30 } 31 printf("%d",dp[m]); 32 return 0; 33 }
(其实不是很终极辣)
1 #include <bits/stdc++.h> 2 #define fp(i,l,r) for(register int i=(l);i<=(r);++i) 3 #define fd(i,l,r) for(register int i=(l);i>=(r);--i) 4 using namespace std; 5 int c[1000+20],w[1000+20],p[1000+20]; 6 int dp[1000+20]; 7 int n,m,n1; 8 inline int botposs(int a,int b,int pd){ 9 if(pd==1) return a>b?a:b; 10 if(pd==0) return a<b?a:b; 11 } 12 int main(){ 13 scanf("%d%d",&m,&n); 14 fp(i,1,n){ 15 scanf("%d%d%d",&w[i],&c[i],&p[i]); 16 } 17 fp(i,1,n){ 18 if(p[i]==0){ 19 fp(j,w[i],m){ 20 dp[j]=botposs(dp[j],dp[j-w[i]]+c[i],1); 21 } 22 } 23 else{ 24 fp(j,1,p[i]){ 25 fd(k,m,w[i]){ 26 dp[k]=botposs(dp[k],dp[k-w[i]]+c[i],1); 27 } 28 } 29 } 30 } 31 printf("%d",dp[m]); 32 return 0; 33 }