zoukankan      html  css  js  c++  java
  • UVA-242 Stamps and Envelope Size (DP)

    题目大意:给一些邮票的面值组合,找出在限定的张数范围内能组合出连续最大值得那个组合。

    题目分析:状态可以这样定义:dp(k,u)表示u能否用k张邮票组合成。状态转移方程很显然了。

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    int a[12][12];
    int dp[12][1005];
    
    bool dfs(int p,int s,int u)
    {
        if(dp[s][u]!=-1) return dp[s][u];
        if(!u) return dp[s][u]=1;
        if(!s) return dp[s][u]=0;
    
        for(int i=1;i<=a[p][0];++i)
            if(u>=a[p][i]&&dfs(p,s-1,u-a[p][i]))
               return dp[s][u]=1;
    
        dp[s][u]=0;
        return false;
    }
    
    int judge(int i,int j)
    {
        if(a[i][0]<a[j][0]) return i;
        if(a[j][0]<a[i][0]) return j;
    
        for(int k=a[i][0];k>=1;--k){
            if(a[i][k]<a[j][k]) return i;
            if(a[j][k]<a[i][k]) return j;
        }
        return i;
    }
    
    int main()
    {
        int s,n;
        while(scanf("%d",&s)&&s)
        {
            scanf("%d",&n);
    
            int ans=0,id=0;
            for(int i=1;i<=n;++i){
                scanf("%d",&a[i][0]);
                for(int j=1;j<=a[i][0];++j)
                    scanf("%d",&a[i][j]);
    
                memset(dp,-1,sizeof(dp));
                int k=1;
                while(dfs(i,s,k)) ++k;
    
                if(k-1>ans)
                    ans=k-1,id=i;
                else if(k-1==ans)
                    id=judge(id,i);
            }
            printf("max coverage =%4d :",ans);
            for(int i=1;i<=a[id][0];++i)
                printf("%3d",a[id][i]);
            printf("
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    计算机网络——简单的端口扫描器
    Java课程设计——模拟行星运动
    H5 自定义数据属性
    实时获取网络状态
    Web 存储
    关于节流阀的理解
    DOM元素尺寸和位置
    H5选择符api
    HTML和XHTML的区别
    HTML的发展史
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/5231688.html
Copyright © 2011-2022 走看看