POJ 3265 DP

来源:互联网 发布:地理空间数据库 编辑:程序博客网 时间:2024/06/16 11:56

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 0
原创粉丝点击