Cash Machine POJ - 1276

的用二进制思想进行优化,要不然会tl

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<math.h>
using namespace std;
#define N 1e9+5
int w[10005],dp[100005];
int main()
{
    int c;
    while(scanf("%d",&c)!=EOF)
    {
        int n,nn,ww,k=0;
        scanf("%d",&n);
        //memset(w,0,sizeof(w));
        memset(dp,0,sizeof(dp));
        //if(n==0){printf("0\n");break;}
        for(int i=1;i<=n;i++){
            scanf("%d%d",&nn,&ww);
            for(int j=1;j<=nn;){
                w[++k]=ww*j;
                nn=nn-j;
                j*=2;
            }
            if(nn>0){w[++k]=ww*nn;}
        }
        for(int i=1;i<=k;i++){
            for(int j=c;j>=w[i];j--){
                dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
            }
        }
        printf("%d\n",dp[c]);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41336270/article/details/84193012