没有剩余空间的完全背包DP
AT4298 [ABC118D] Match Matching
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<map> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f using namespace std; long long n,m; int a[11],v[11],w[11]; int dp[1000005]; long long Max(long long XXX,long long YYY){ return XXX>YYY ? XXX : YYY; } struct node{ long long w; long long v; }z[1001]; int cmp(node XX,node YY){ if(XX.v==YY.v) return XX.w<YY.w; return XX.v>YY.v; } int main(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) dp[i]=-1; for(int i=1;i<=m;i++) cin>>a[i]; for(int i=1;i<=m;i++){ z[i].v=a[i]; if(a[i]==1) z[i].w=2; if(a[i]==2) z[i].w=5; if(a[i]==3) z[i].w=5; if(a[i]==4) z[i].w=4; if(a[i]==5) z[i].w=5; if(a[i]==6) z[i].w=6; if(a[i]==7) z[i].w=3; if(a[i]==8) z[i].w=7; if(a[i]==9) z[i].w=6; } dp[0]=0; for(int i=1;i<=m;i++){ for(int j=z[i].w;j<=n;j++){ if(dp[j-z[i].w]==-1) continue; if(dp[j]==-1) dp[j]=dp[j-z[i].w]+1; dp[j]=Max(dp[j],dp[j-z[i].w]+1); } } sort(z+1,z+m+1,cmp); while(n!=0){ for(int i=1;i<=m;i++){ if(n<z[i].w) continue; if(dp[n]!=dp[n-z[i].w]+1) continue; cout<<z[i].v; n-=z[i].w; break; } } return 0; }
与可有剩余空间的完全背包对比
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,m,w[101],v[101],c[101],dp[1001]; 5 int main(){ 6 scanf("%d%d",&n,&m); 7 for(int i=1;i<=n;i++) scanf("%d%d%d",&w[i],&v[i],&c[i]); 8 //w[i] weight,v[i] value,c[i] count 9 for(int i=1;i<=n;i++) 10 for(int j=m;j>=0;j--) 11 for(int k=0;k<=c[i];k++){ 12 if(j-k*w[i]<0) break; 13 dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]); 14 } 15 printf("%d",dp[m]); 16 }

浙公网安备 33010602011771号