POJ 3265 DP

cow每个月月末可以得到m钱,一共有n个问题需要解决

如果解决某个问题,必须在第i月支付定金,并在i+1月支付尾款,需按顺序解决问题,每个月的金钱只能在下个月使用,不能累加

f[i][j]=Max(m-∑b[j]-∑b[k]){其中,k应当满足f[i-1][k]>=∑a[j]-∑a[k]}

f[i][j]表示在第i个月解决前j个问题所能剩下的最多的钱数

#include "stdio.h"
#include "string.h"

int dp[2010][310];

int Max(int a,int b)
{
    if (a<b) return b;
    else return a;
}

int main()
{
    int i,j,ans,m,n,a,b;
    int suma[310],sumb[310];
    while (scanf("%d%d",&m,&n)!=EOF)
    {
        memset(suma,0,sizeof(suma));
        memset(sumb,0,sizeof(sumb));

        for (i=1;i<=n;i++)
        {
            scanf("%d%d",&a,&b);
            suma[i]=suma[i-1]+a;
            sumb[i]=sumb[i-1]+b;
        }

        ans=0;
        memset(dp,-1,sizeof(dp));
        dp[1][0]=m;
        while (1)
        {
            ans++;
            for (i=1;i<=n;i++)
                for (j=i;j>=0;j--)
                {
                    if (dp[ans-1][j]>=suma[i]-suma[j] && m>=sumb[i]-sumb[j])
                        dp[ans][i]=Max(dp[ans][i],m-sumb[i]+sumb[j]);
                    if (dp[ans][i]==m) break;
                }

            if (dp[ans][n]>=0) break;

        }
        printf("%d\n",ans+1);
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值