【鸽笼原理】ZOJ 2955

用到了鸽笼原理的结论:设可选的 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;
}



















阅读更多
文章标签: c
个人分类: 数学 DP
上一篇【计算几何——直线相交】POJ 1039
下一篇【dp求期望值】POJ 3756
想对作者说点什么? 我来说一句

ZOJ解题报告ZOJ解题报告

2010年08月02日 282KB 下载

没有更多推荐了,返回首页

关闭
关闭