没有剩余空间的完全背包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 }

 

posted @ 2021-08-10 21:49  latent_Lin  阅读(39)  评论(0)    收藏  举报