免费网站建设好不好,建筑工程网校官网,开一家做网站的公司,新世纪建设集团网站题目链接#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1917
题目
1917#xff1a;【01NOIP普及组】装箱问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4117 通过数: 2443
【题目描述】 有一个箱子容量为V#xfffd;(正整数#xff0c…
题目链接http://ybt.ssoier.cn:8088/problem_show.php?pid1917
题目
1917【01NOIP普及组】装箱问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 4117 通过数: 2443
【题目描述】 有一个箱子容量为V(正整数0≤V≤200000≤≤20000同时有n个物品0≤n≤300≤≤30),每个物品有一个体积正整数。要求从n个物品中任取若干个装入箱内使箱子的剩余空间为最小。 【输入】 第一行是箱子的容量,第二行是n(表示n有n个物品),接下来n行是n个物品的体积。 【输出】 最小空间 【输入样例】
24
6
8
3
12
7
9
7
【输出样例】
0
题目详解 f[i][j]:表示前i件物品装满了容量是j 以前f[i][j]100 表示前i个人吃j个包子得到的最大价值为100 现在f[i][j]存放的是true和false表示前i个人有没有吃完j个包子 f[i][j]true表示前i件物品装满了容量是j的箱子没有装满为false f[i][j]关键看第i件物品背或不背 f[i][j]关键看第i件物品背或不背 不背 f[i-1][j]0 1 0 1 背f[i-1][j-w[i]]0 0 1 1 f[i][j]0, 1, 1, 1 f[j] f[j] || f[j-w[i]]; 上代码此为01背包 includebits/stdc.h
using namespace std;
int main()
{int i,j,f[20001]{0},n,v,w[10001],c,k;cinv;cinn;for(i1;in;i)cinw[i];f[0]true;//边界默认容量为0的箱子什么都不装是满的 //剩下的f[1]...[20001] 都是0没有装满 for(i1;in;i)for(jv;jw[i];j--)f[j]f[j]||f[j-w[i]];//以前是求最大 //前i件物品能不能装满容量为i的箱子//情况一前i-1件物品能装满则f[j]必然为true//情况二前i-1件物品没装满,则要判断装入第i件物品f[j-w[i]]true,则结果f[j]为true //只要有一个为true就表示可以装满 for(kv;k0;k--)if(f[k]true)//体积从大到小第一个装满的最大容量 {coutv-kendl; return 0;//break;找到第一个最大的就结束了 //k100,f[100]false,....k90,f[90]true,所以第一个装满的是90 }}点赞关注收藏