UVA 11154 Weights and Measures(线性DP)

来源:互联网 发布:抗战中日伤亡真实数据 编辑:程序博客网 时间:2024/04/28 21:40

地址:点击打开链接

问最大层叠数,首先安承载能力由小到达,设dp[i][j]:前i个人叠j层的

最小重量。 dp[i][j]=min(dp[i-1][j],dp[i-1][j-1]).

#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<string>#include<iostream>#include<queue>#include<cmath>#include<map>#include<stack>#include<bitset>using namespace std;#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )#define CLEAR( a , x ) memset ( a , x , sizeof a )typedef long long LL;typedef pair<int,int>pil;const int INF = 0x3f3f3f3f;const int maxn=6600;struct node{    int w,s;}e[maxn];int dp[maxn][maxn];//前i只乌龟叠j层int cmp(node l1,node l2){    return l1.s<l2.s;}int main(){    int cnt=1,x,ans=0;    while(~scanf("%d%d",&e[cnt].w,&e[cnt].s))        cnt++;    sort(e+1,e+cnt,cmp);    CLEAR(dp,INF);    REP(i,cnt)        dp[i][0]=0;    REPF(i,1,cnt)    {        for(int j=1;j<=i;j++)        {            dp[i][j]=dp[i-1][j];//不选            int x=e[i].s-e[i].w;            if(x>=dp[i-1][j-1]&&dp[i-1][j-1]!=INF)                dp[i][j]=min(dp[i][j],dp[i-1][j-1]+e[i].w);        }    }    for(int i=cnt-1;i>=1;i--)        if(dp[cnt-1][i]!=INF)        {            ans=i;            break;        }    printf("%d\n",ans);    return 0;}


0 0