关闭

【鸽笼原理】ZOJ 2955

标签: c
633人阅读 评论(0) 收藏 举报
分类:

用到了鸽笼原理的结论:设可选的 N 个数从小到大依次为 a(1)、 a(2) … a(N),则在最优的取法中,小于 a(N) 的数不会多于 a(N) 个。

#define N 10005
int dp[N];
int w[111];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,c;
        scanf("%d%d",&n,&c);
        int i,j;
        for(i=1;i<=n;i++)scanf("%d",&w[i]);
        sort(w+1,w+1+n);
        int mx = w[n]*w[n];
        memset(dp,-1,sizeof(dp));
        dp[0] = 0;
        for(i=1;i<=n;i++){
            for(j=w[i];j<mx;j++){
                if(dp[j-w[i]]!=-1 && (dp[j]==-1 || dp[j-w[i]] + 1<dp[j]))
                dp[j] = dp[j-w[i]]+1;
            }
        }
        int res = c;
        int cnt = 0;
        if(c>=mx){
            res = c%mx;
            cnt = (c-c%mx)/w[n];
        }
        int ans;
        if(dp[res]==-1)ans=-1;
        else ans = cnt+dp[res];
        printf("%d\n",ans);
    }
    return 0;
}



















0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:386792次
    • 积分:7644
    • 等级:
    • 排名:第2763名
    • 原创:412篇
    • 转载:27篇
    • 译文:0篇
    • 评论:39条
    最新评论
    other