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

Y的积木

时间:2018-10-18 18:04:10      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:namespace   简单   turn   names   fine   sum   using   max   价值   

dp

一眼看上去就要统计方案:设dp[i][k]代表考虑到第i行,满足价值总和为k的方案数。
转移挺简单的:\[dp[i][k]=\sum \limits_{j=1}^m dp[i-1][k-j]\]

code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#define max(a,b) a>b?a:b
#define maxn 102
using namespace std;
int n,fcnt,fina;
int num[maxn],bkt[maxn][maxn],dp[maxn][maxn*maxn],mx[maxn];
int main()
{
    cin>>n>>fcnt;
    for (int i=1,a,b;i<=n;++i)
    {
        scanf("%d",&a);
        for (int j=1;j<=a;++j)
        {
            scanf("%d",&b);
            bkt[i][b]++;
            mx[i]=max(mx[i],b);
        }
        fina+=mx[i];
    }
    for (int i=1;i<=mx[1];++i) {dp[1][i]=bkt[1][i];} 
    for (int i=2;i<=n;++i)
    {
        for (int j=1;j<=fina;++j)
        for (int k=1;k<=mx[i];++k) 
        if (j-k>0&&bkt[i][k]) dp[i][j]+=dp[i-1][j-k]*bkt[i][k];
    }
    int cnt=0;
    for (int i=1;i<=fina;++i)
    for (int j=1;j<=dp[n][i];++j)
    {
        cnt++;
        if (cnt>fcnt) return 0;
        printf("%d ",i);
    }
    return 0;
}

Y的积木

标签:namespace   简单   turn   names   fine   sum   using   max   价值   

原文地址:https://www.cnblogs.com/bullshit/p/9811786.html

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