codeforces 189A Cut Ribbon

来源:互联网 发布:三国志9优化伴侣32位 编辑:程序博客网 时间:2024/06/08 12:33

很简单的一道题,暴力就行了,我这里用背包dp来做。本题是一道完全背包。

0-1背包的状态转移方程:dp[i][j]表示用前j容量装前i件物品,dp[i][j]=max(dp[i-1][j-v[i]]+w[i],dp[i-1][j]),可省略第一维,循环必须V:v-0;

完全背包:dp[i][j]=max(dp[i-1][j],dp[i][j-v[i]]+w[i]),可省略第一维,循环V:0-v;

若问恰好装满,可初始化dp[0]=0,dp[i]=-inf;

二维:

#include<iostream>#include<string>#include<cstring>#include<cstdio>#include<cmath>#include<iomanip>#include<map>#include<algorithm>#include<queue>#include<set>#define inf 10000000#define pi acos(-1.0)#define eps 1e-8#define seed 131using namespace std;typedef pair<int,int> pii;typedef unsigned long long ULL;typedef long long LL;const int maxn=100005;int dp[4][4005];int main(){    int d[4];    int n;    scanf("%d%d%d%d",&n,&d[1],&d[2],&d[3]);    dp[0][0]=0;    for(int i=1;i<=n;i++)        dp[0][i]=-inf;    for(int i=1;i<=3;i++)    {        for(int j=0;j<=n;j++)        {            dp[i][j]=-inf;            if(dp[i-1][j]>=0)                dp[i][j]=max(dp[i][j],dp[i-1][j]);            if(j-d[i]>=0&&dp[i][j-d[i]]>=0)                dp[i][j]=max(dp[i][j],dp[i][j-d[i]]+1);        }    }    cout<<dp[3][n];    return 0;}
一维:

#include<iostream>#include<string>#include<cstring>#include<cstdio>#include<cmath>#include<iomanip>#include<map>#include<algorithm>#include<queue>#include<set>#define inf 10000000#define pi acos(-1.0)#define eps 1e-8#define seed 131using namespace std;typedef pair<int,int> pii;typedef unsigned long long ULL;typedef long long LL;const int maxn=100005;int dp[4005];int main(){    int d[4];    int n;    scanf("%d%d%d%d",&n,&d[1],&d[2],&d[3]);    dp[0]=0;    for(int i=1;i<=n;i++)        dp[i]=-inf;    for(int i=1;i<=3;i++)    {        for(int j=0;j<=n;j++)        {            //dp[j]=max(dp[j],dp[j]);            if(j-d[i]>=0)                dp[j]=max(dp[j],dp[j-d[i]]+1);        }    }    cout<<dp[n];    return 0;}


0 0
原创粉丝点击