博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划入门 洛谷P2409 Y的积木
阅读量:4679 次
发布时间:2019-06-09

本文共 1459 字,大约阅读时间需要 4 分钟。

 P2409 Y的积木

题目背景

Y是个大建筑师,他总能用最简单的积木拼出最有创意的造型。

题目描述

Y手上有n盒积木,每个积木有个重量。现在他想从每盒积木中拿一块积木,放在一起,这一堆积木的重量为每块积木的重量和。现在他想知道重量和最小的k种取法的重量分别是多少。(只要任意更换一块积木,就视为一种不同的取法。如果多种取法重量总和一样,我们需要输出多次。)

输入输出格式

输入格式:

 

第一行输入两个整数,n,k,意义如题目所描述。

每组数据接下来的n行,第一个整数为mi,表示第i盒积木的数量,在同一行有mi个整数,分别表示每个积木的重量。

 

输出格式:

 

一行,重量最小的k种取法的重量,要求对于每个数据,从小到大输出

 

输入输出样例

输入样例#1:
3 104 1 3 4 53 1 7 94 1 2 3 5
输出样例#1:
3 4 5 5 6 6 7 7 7 7

说明

对于30%的数据:2<=mi<=10,1<=n<=10

对于50%的数据:2<=mi<=50,1<=n<=50

对于100%的数据:2<=mi<=100,1<=n<=100,1<=k<=10000,每个积木的重量为不超过100的正整数,所有mi的积大于等于k。本题不卡常。

 

 

分组背包

真水题......我真菜......

 

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 int n,k,sum; 7 int mi[110],in[110][110],f[110][10010]; 8 //f[i][j] 前i个盒子质量为j的方案数 9 int main(){10 scanf("%d%d",&n,&k);11 for(int i=1;i<=n;i++){12 int maxx=0;13 scanf("%d",&mi[i]);14 for(int j=1;j<=mi[i];j++){15 scanf("%d",&in[i][j]);16 maxx=(maxx,in[i][j]);17 }18 sum+=maxx;19 }20 f[0][0]=1;21 for(int i=1;i<=n;i++)22 for(int j=1;j<=mi[i];j++)23 for(int p=sum;p>=in[i][j];p--)24 if(f[i-1][p-in[i][j]]) f[i][p]+=f[i-1][p-in[i][j]];25 for(int i=1;i<=sum;i++)26 for(int j=1;j<=f[n][i];j++)27 if(k) printf("%d ",i),k--;28 else return 0;29 return 0;30 }

 

转载于:https://www.cnblogs.com/sdfzxh/p/6892119.html

你可能感兴趣的文章
python url库学习
查看>>
找“水王”
查看>>
Advanced Views and URLconfs(The Definitive Guild to Django)
查看>>
CodeForces 132C 一道简单 dp
查看>>
018-伸展树
查看>>
FPM打包工具
查看>>
JDK版本不兼容问题之:一台机器安装多个版本的JDK
查看>>
2016年 前端学习网站
查看>>
20145302张薇《Java程序设计》第八周学习总结
查看>>
JavaScript之数组的常用操作函数
查看>>
Python之时间表示
查看>>
jmeter参考网址
查看>>
【算法导论】简单哈希表的除法实现
查看>>
孔雀翎----《Programming C# 》中国版 文章4版
查看>>
大学四年,你必须做的事---这些计算机科学
查看>>
Neo4j集群环境建设
查看>>
软件測试自学指南---从入门到精通
查看>>
LoadImage()的使用
查看>>
SSL协议具体解释
查看>>
浅谈实际分辨率与逻辑分辨率实现像素与尺寸的准确转换
查看>>