求容器算法问题, 找零钱问题的另一个版本

CheerDesiger 2008-08-18 05:03:20
有一个容器装满了80 立方米的水银, 现在容器快破了, 需要更换容器, 市场上的容器有3种
28 立方米 56 立方米 72 立方米 价格分别为 560 元 810 元 1020 元, 求用最少的钱
从市场上买回容器以完成容器转换, 请问应该如何实现
...全文
160 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
veloting 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 CheerDesiger 的回复:]
对啊, 每个东西都有两种状态, 表示选或不选,
0-1背包是已知 容器 容积c , 有n 个物品, 体积 v1...vn,价值m1...mn 求c 装入物品价值最大
也就是说, v1 只会有两种情况, 要么被装入, 要么不被装入.

而我的却相反啊, 只有一个物品 , 体积w, 要装入容积为v1...vn等容器中, 价值m1...mn,
v1 却可以为多个的, 比如 156体积的东西, 装入到 28, 65的容器中, 那可能需要两个65 一个28来装.

我已用递归穷举实现, 但总觉得应该有更…
[/Quote]
说的不错,呵呵!
应该有相应的算法吧!!不过应该都挺费脑筋的!!!
herman~~ 2008-08-19
  • 打赏
  • 举报
回复
没看到啥好方法,穷举法吧
CheerDesiger 2008-08-19
  • 打赏
  • 举报
回复
对啊, 每个东西都有两种状态, 表示选或不选,
0-1背包是已知 容器 容积c , 有n 个物品, 体积 v1...vn,价值m1...mn 求c 装入物品价值最大
也就是说, v1 只会有两种情况, 要么被装入, 要么不被装入.

而我的却相反啊, 只有一个物品 , 体积w, 要装入容积为v1...vn等容器中, 价值m1...mn,
v1 却可以为多个的, 比如 156体积的东西, 装入到 28, 65的容器中, 那可能需要两个65 一个28来装.

我已用递归穷举实现, 但总觉得应该有更好的办法.
guzhilei1986 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 CheerDesiger 的回复:]
一楼教训得是, 惭愧中
二楼如果增加容器类型又将会如何?
三楼、四楼 0-1背包 从物品中选取0个或者1个, 这里却是选取
0 个或者多个, 是不太一样的。
[/Quote]
哈哈,好好看看算法哦。0-1背包的意思就是,有n的东西,每个东西都有两种状态(0,1),0表示不选这个东西,1表示选这个东西。最后得到的价值最大。你的题目应该就是最后花的钱最少。
veloting 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 CheerDesiger 的回复:]
一楼教训得是, 惭愧中
二楼如果增加容器类型又将会如何?
三楼、四楼 0-1背包 从物品中选取0个或者1个, 这里却是选取
0 个或者多个, 是不太一样的。
[/Quote]
0-1背包 从物品中选取0个或者多个,不是0个或者1个
CheerDesiger 2008-08-19
  • 打赏
  • 举报
回复
一楼教训得是, 惭愧中
二楼如果增加容器类型又将会如何?
三楼、四楼 0-1背包 从物品中选取0个或者1个, 这里却是选取
0 个或者多个, 是不太一样的。
bitxinhai 2008-08-19
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

void main()
{
int i,j,k,nMin = 100000;
int n1,n2,n3;
for(i = 0;i <= 3;i++)
for(j = 0;j <= 2;j++)
for(k = 0;k <= 2;k++)
{

if(i*28 + j*56 + k*72 >= 80)
{
int m = i*560 + j*810 + k*1020;
if(m < nMin)
{
nMin = m;
n1 = i;n2 = j;n3 = k;
}

}
}

cout<<nMin<<endl;
cout<<n1<<" "<<n2<<" "<<n3<<endl;
}
richbirdandy 2008-08-18
  • 打赏
  • 举报
回复
的确是0-1背包问题
guzhilei1986 2008-08-18
  • 打赏
  • 举报
回复
这个应该是一个背包问题吧。
0-1背包。
楼主可以搜一下。
jy01807853 2008-08-18
  • 打赏
  • 举报
回复

//我是这样想的
//有错楼下指出
#include <stdio.h>

int main()
{
int k, j, min = 20000, tmp = 0;
int tmp1, tmp2, tmp3;
for (int i = 0; i != 3; i++)
{
for (k = 0; k != 3; k++)
{
for ( j = 0;j != 3 ; j++)
{
if ((i * 28 + k * 56 + j * 72) >= 80)
{
tmp = i * 560 + k * 810 + j * 1020;
if (min > tmp)
{

min = tmp;
tmp1 = i;
tmp2 = k;
tmp3 = j;
}
}
}

}
}
printf("%d,%d,%d\n", tmp1, tmp2, tmp3);
printf("%d\n", min);
}
veloting 2008-08-18
  • 打赏
  • 举报
回复
算法算是白学了,我!!!555555

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧