码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 242 - Stamps and Envelope Size(DP)

时间:2015-08-29 18:48:11      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:uva   dp   背包   

给出一个s,然后给出n组邮票,问那一组可以凑出最大连续邮资。
对每一组邮票,求出当邮资为i时需要邮票数的最小值d[i],边界为d[0]=0d[i]>s时break。类似于背包问题的求法,具体方法见代码。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010;
int d[maxn],ans[20],num[20],a[20][20];
int main(){
    int s;
    while(~scanf("%d",&s)&&s){
        int n;scanf("%d",&n);
        for(int i=1;i<=n;++i){
            scanf("%d",&num[i]);
            for(int j=1;j<=num[i];++j) scanf("%d",&a[i][j]);
            memset(d,0x3f,sizeof(d));
            d[0]=0;
            for(int j=1;j<maxn;++j){
                for(int k=1;k<=num[i]&&j-a[i][k]>=0;++k)
                    d[j]=min(d[j],d[j-a[i][k]]+1);
                if(d[j]>s){ans[i]=j-1;break;}
            }
        }
        int best=-1,pos=0;
        for(int i=1;i<=n;++i){
            if(ans[i]>best) best=ans[i],pos=i;
            else if(ans[i]==best){
                if(num[i]<num[pos]) pos=i;
                else if(num[i]==num[pos]){
                    bool ok=false;
                    for(int j=num[i];j>0;--j)
                        if(a[i][j]!=a[pos][j]){
                            ok=a[i][j]<a[pos][j];
                            break;
                        }
                    if(ok) pos=i;
                }
            }
        }
        printf("max coverage =%4d :",ans[pos]);
        for(int i=1;i<=num[pos];i++)
            printf("%3d",a[pos][i]);
        printf("\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

UVa 242 - Stamps and Envelope Size(DP)

标签:uva   dp   背包   

原文地址:http://blog.csdn.net/wcr1996/article/details/48089427

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!