uva 242——Stamps and Envelope Size

题意:给定最大贴邮票上限和若干个邮票组合,求最大的连续邮资的一个组合,如果有多个,按字典序输出最大的一个。


思路:对每一组邮票,求出当邮资为i时需要邮票数的最小值 d[i] ,边界为 d[0]=0 d[i]>s 时break。属于01背包问题。


code:

#include <bits/stdc++.h>
using namespace std;

#define cls(a,c) memset(a,c,sizeof (a))
#define ft(i,s,t) for (int i=s;i<=t;i++)
const int N=15,M=1005;
int m,k,n;
int mb[N];
int a[N][N],b[N][N];
int f[M];

void sol(int k,int n){
    cls(f,63);f[0]=0;
    ft(i,1,m) ft(j,1,n){
       if (i<a[k][j]) continue;
       f[i]=min(f[i],f[i-a[k][j]]+1);
    }
}
int main()
{
    while (~scanf("%d %d",&k,&n),k){
        int ans=0,id;
        ft(i,1,n){
            scanf("%d",&mb[i]);
            ft(j,1,mb[i]) scanf("%d",a[i]+j),b[i][j]=a[i][j];
            sort (a[i]+1,a[i]+mb[i]+1);
             m=k*a[i][mb[i]];
             sol(i,mb[i]);
             ft(j,1,m){
                if (f[j]<=k&j<m) continue;
                if (f[j]>k) j--;
                if (ans<j) ans=j,id=i;
                else if (ans==j){
                    int t=mb[i];
                    if (t<mb[id]) id=i;
                    else if (t==mb[id]&&a[i][t]<a[id][t]) id=i;
                }
                break;
             }
        }
       printf("max coverage =%4d :",ans);
       ft(i,1,mb[id]) printf("%3d",b[id][i]);
       puts("");
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值