• poj 1015(dp)


    看的解题报告。。http://blog.csdn.net/lyy289065406/article/details/6671105

    View Code
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 
     8 int dp[22][805];
     9 int path[22][805];
    10 int p[205],d[205],s[205],v[205];
    11 int ans[205];
    12 int n,m;
    13 
    14 bool can(int j,int k,int i)
    15 {
    16     while(j>0)
    17     {
    18         if(path[j][k]==i)
    19             return false;
    20         k-=v[path[j][k]];
    21         j--;
    22     }
    23     return true;
    24 }
    25 
    26 int main()
    27 {
    28     int cas=1;
    29     while(scanf("%d%d",&n,&m))
    30     {
    31         if(!n && !m) break;
    32         memset(dp,-1,sizeof(dp));
    33         memset(path,0,sizeof(path));
    34         for(int i=1;i<=n;i++)
    35         {
    36             scanf("%d%d",&p[i],&d[i]);
    37             s[i]=p[i]+d[i];
    38             v[i]=p[i]-d[i];
    39         }
    40         int fix=m*20;
    41         dp[0][fix]=0;
    42         for(int j=1;j<=m;j++)
    43         {
    44             for(int k=0;k<=2*fix;k++)
    45             {
    46                 if(dp[j-1][k]>=0)
    47                 {
    48                     for(int i=1;i<=n;i++)
    49                     {
    50                         if(dp[j][k+v[i]] < dp[j-1][k] + s[i] && can(j-1,k,i))
    51                         {
    52                             dp[j][k+v[i]]=dp[j-1][k]+s[i];
    53                             path[j][k+v[i]]=i;
    54                         }
    55                     }
    56                 }
    57             }
    58         }
    59 
    60         int minv=0;
    61         for(int k=0;k<=fix;k++)
    62         {
    63             if(dp[m][fix+k]>=0 && dp[m][fix+k]>dp[m][fix-k])
    64             {
    65                 minv=fix+k;
    66                 break;
    67             }
    68             else if(dp[m][fix-k]>=0)
    69             {
    70                 minv=fix-k;
    71                 break;
    72             }
    73         }
    74         printf("Jury #%d\n",cas++);
    75         printf("Best jury has value %d for prosecution and value %d for defence:\n",(dp[m][minv]+minv-fix)/2,(dp[m][minv]+fix-minv)/2);
    76         for(int j=m,k=minv;j>0;j--)
    77         {
    78             ans[j]=path[j][k];
    79             k-=v[ans[j]];
    80         }
    81         sort(ans+1,ans+m+1);
    82         for(int i=1;i<=m;i++)
    83             printf(" %d",ans[i]);
    84         puts("\n");
    85     }
    86     return 0;
    87 }
  • 相关阅读:
    css定位
    Register Form
    自我介绍
    靠,用 mod_proxy_ajp 代替 mod_jk 不知简单多少倍
    Mac 切换 32 和 64
    JAVA面向对象(8)
    JAVA面向对象(7)
    JAVA面向对象(6)
    JAVA面向对象(5)
    JAVA面向对象(4)
  • 原文地址:https://www.cnblogs.com/Missa/p/2790613.html
Copyright © 2020-2023  润新知