实验三 贪心算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三 贪心算法的应用



一、实验目的

1.掌握贪心算法的基本概念和两个基本要素

2.熟练掌握贪心算法解决问题的基本步骤。

3.学会利用贪心算法解决实际问题。

二、实验内容


题目一:部分背包问题
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在选择物品i装入背包时,可以选择物品i的一部分。


硬币找钱问题

问题描述

设有6种不同面值的硬币,各硬币的面值分别为5分,1角,2角,5角,1元,2元。现要用这些面值的硬币来购物和找钱。购物时规定了可以使用的各种面值的硬币个数。

假定商店里各面值的硬币有足够多,顾客也可用多种方式支付。在1次购物中希望使用最少硬币个数。例如,1次购物需要付款0.55元,没有5角的硬币,只好用2*20+10+5共4枚硬币来付款。如果付出1元,找回4角5分,同样需要4枚硬币。但是如果付出1.05元(1枚1元和1枚5分),找回5角,只需要3枚硬币。这个方案用的硬币个数最少。

您的任务:对于给定的各种面值的硬币个数和付款金额,计算使用硬币个数最少的交易方案。

输入

有若干行测试数据。每一行有6个整数a5、a4、a3、a2、a1、a0和1个有2位小数的实数money,分别表示5分,1角,2角,5角,1元,2元面值的硬币个数和付款金额,money<=1000。文件以6个0结束(不必处理)。

输出

对每一行测试数据,一行输出最少硬币个数。如果不可能完成交易,则输出“impossible”。

输入样例

2 4 2 2 1 0 0.95

2 4 2 0 1 0 0.55

0 0 0 0 0 0

输出样例

2

3

题目一:部分背包问题(略————)

题目二:硬币找钱问题
#include<iostream>
using namespace std;
#define MAX 1000000

int mon[6]={5,10,20,50,100,200};

int marketret(int money)
{
int r=0,i;
for(i=5;i>-1&&money;i--)
{
r+=money/mon[i];
money%=mon[i];
}
return r;
}

int main()
{
while(1)
{
int number[6],money,max,min[100010],pay=0,i,j;
for(i=0,max=0;i<6;i++)
{
cin>>number[i];
max+=number[i]*mon[i];
}
cin>>pay;
for(i=1;i<=max;i++)
min[i]=MAX;
min[0]=0;
for(i=0;i<6;i++)
while(number[i])
{
number[i]--;
for(j=0;j<=max;j++)
if(min[j]!=MAX&&j+mon[i]<=max&&min[j]+1<min[j+mon[i]])
min[j+mon[i]]=min[j]+1;
}
int out=MAX;
for(i=pay;i<=max;i++)
if(min[i]!=MAX&&(i-pay)%5==0&&min[i]+marketret(i-pay)<out)
out=min[i]+marketret(i-pay);
if(out<MAX)

cout<<out<<endl;
else
cout<<"impossible"<<endl;
}
}



案。



相关文档
最新文档