CodeForces-189A Cut Ribbon-必须装满的背包

题意:

给定n,

s.t.  a1*x1+a2*x2+a3*x3=n(1)

max:x1+x2+x3

对比完全背包,(1)式取等号而不是<=

这个差别影响了我们的结果

比如:

n=7,a1=a2=5,a3=2

如果按照完全背包的转移:

则在dp[7]=3,也就是2+2+2

但背包并没有装满

装满的方案是:dp[7]=2,也就是2+5

那么我们在枚举容量的时候,不能去涉及那些减不完的状态

我们只能枚举,j=2(=4=6),h=5,这时就避免了:dp[5]=max(dp[5],dp[5-2]+1)=2,因为3是没办法凑满的

设置初始量为-1,dp[0]=0->dp[2]=max(dp[2],dp[2-2]+1),这时候需要dp[0]=0

#include<bits/stdc++.h>
using namespace std;
const int maxw=4e3+1e1;
int w[3],dp[maxw];

int main()
{
    int n;cin>>n;
    for(int i=0;i<3;i++)cin>>w[i];
    fill(dp,dp+maxw,-1);
    dp[0]=0;
    for(int i=0;i<3;i++)
    {
        for(int j=w[i];j<=n;j++)
        {
            if(dp[j-w[i]]!=-1)
            {
                dp[j]=max(dp[j],dp[j-w[i]]+1);
            }
        }
    }
    cout<<dp[n]<<"\n";
    return 0;
}

 

posted @ 2022-09-22 13:03  惣聪术  阅读(47)  评论(0编辑  收藏  举报