zoukankan      html  css  js  c++  java
  • Building Block 动态规划

    <问题分析>

    把积木可搭建的最大高度看做背包的载重,每块积木的高度就是物品的重量,也就是用给定的物品装指定的包,使每个包装的物品一样多,且在符合条件的前提下尽量多。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 
     5 int cmp(const void *a,const void *b)
     6 {
     7     return *(int *)a-*(int *)b;
     8 }
     9 
    10 int main()
    11 {
    12     int n,i,j,k;
    13     int val[101],max[101];
    14     bool val1[101][10001];
    15     scanf("%d",&n);
    16     max[0]=0;
    17     for(i=1;i<=n;i++)
    18     {
    19         memset(val1[i],0,sizeof(bool)*10001);
    20         val1[i][0]=true;max[i]=0;
    21     }
    22     for(i=1;i<=n;i++)
    23     {
    24        val[0]=0;
    25        while(scanf("%d",&j),j!=-1)
    26        {
    27           val[0]++;
    28           val[val[0]]=j;
    29        }
    30        for(j=1;j<=val[0];j++)
    31        {
    32          max[i]+=val[j];
    33          for(k=0;k<=max[i];k++)
    34          {
    35             if(val1[i][k])
    36             {
    37                val1[i][k+val[j]]=true;
    38             }
    39               
    40          }
    41        }
    42     }
    43     qsort(max,n,sizeof(int),cmp);
    44     for(i=1;i<=max[1];i++)
    45     {
    46        if(val1[1][i])
    47        {
    48           printf("%d ",i);
    49           for(j=1;j<=n;j++)
    50           if(!val1[j][i]) break;
    51           if(j>n)
    52             max[0]=i;
    53        }
    54     }
    55     printf("%d
    ",max[0]);
    56     while(true);
    57     return 0;
    58 }
  • 相关阅读:
    连续奇数
    50:数根
    38:花生采摘
    素数对
    17:字符串判等
    2702:密码翻译
    27:单词翻转
    15:整理药名
    12:加密的病历单
    09:密码翻译
  • 原文地址:https://www.cnblogs.com/simplesslife/p/BuildingBlock.html
Copyright © 2011-2022 走看看