A. c語言,貪心演算法,貨幣找零問題
貪心演算法找零就是現實中從最大面額開始找的思路。不代表是最優解,只是演算法之一。
由於面額輸入順序不定,我先對輸入的面額進行降序排序。
下面代碼:
#include <stdio.h>
#include <malloc.h>
int main()
{
int i,j,m,n,*ns=NULL,*cn=NULL,sum=0;
printf("請輸入總金額m及零錢種類n:"),scanf("%d",&m),scanf("%d",&n);
printf("請分別輸入%d種零錢的面額: ",n);
if(!(ns=(int *)malloc(sizeof(int)*n))) return 1;
if(!(cn=(int *)malloc(sizeof(int)*n))) return 1;
for(i=0;i<n;i++) scanf("%d",&ns[i]);
//------------考慮輸入面額順序不定,先對面額進行降序排列(如按照降序輸入,該段可刪除)
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(ns[j]>ns[i]) ns[j]^=ns[i],ns[i]^=ns[j],ns[j]^=ns[i];
//-------------------------------------------------------------------
for(i=0;i<n;i++)//貪心演算法,從最大面額開始
if(m>=ns[i])
cn[i]=m/ns[i],m=m%ns[i],sum+=cn[i],printf("%d元%d張 ",ns[i],cn[i]);
printf(" 最少使用零錢%d張 ",sum);
return 0;
}
B. C語言 貪心演算法求背包問題
是你的冒泡排序出了問題~
你吧 原來的1-2-3號按照東西的價值重新排列現在的1-2-3對應原來的2-1-3了
所以 你輸出的時候是按 1-2-3輸出的話 就等於第一個是原來的X2 第二個是X1第三個是X3
而且你的冒泡排序用錯了 只比較了 P[0]/K[0]和P[1]/K[1] P[1]/K[1]和P[2]/K[2]
周一我去學校幫你重新改改 我家的機器沒有C++
周一晚上我會上傳答案~我最近正好也要做演算法的作業~
#include <stdio.h>
#include <math.h>
#define N 50
float find(float p[N],float w[N],float x[N] ,float M,int n) /*先放單位價值量大的物體,再考慮小的物體*/
{
int i;
float maxprice;
for (i = 0; i < n; i++)
x[i] = 0;
i = 0;
maxprice=0;
while (i < n && w[i] < M)
{
M=M-w[i];
x[i] =w[i]; /* 表示放入數量 */
maxprice=maxprice+p[i];
x[n-1]=M;
i++;
}
if (i < n &&M> 0)
{
maxprice=maxprice+p[i]*x[i]/w[i];
i++;
}
return maxprice;
}
int main()
{
int n,flag=1;
float temp,M,w[N],p[N],x[N];
int a[N],b[N];
int k,j,l=0;
printf(
C. c語言問題急!!!(用貪心演算法)
題分析:
根據常識,我們到店裡買東西找錢時,老闆總是先給我們最大面值的,要是不夠再找面值小一點的,直到找滿為止。如果老闆都給你找分數的或者幾角的,那你肯定不幹,另外,他也可能沒有那麼多零碎的錢給你找。其實這就是一個典型的貪心選擇問題。
問題的演算法設計與實現:
先舉個例子,假如老闆要找給我99分錢,他有上面的面值分別為25,10,5,1的硬幣數,為了找給我最少的硬幣數,那麼他是不是該這樣找呢,先看看該找多少個25分的,誒99/25=3,好像是3個,要是4個的話,我們還得再給老闆一個1分的,我不幹,那麼老闆只能給我3個25分的拉,由於還少給我24,所以還得給我2個10分的和4個1分。
具體實現
Code:
//找零錢演算法//By falcon//輸入:數組m,依次存放從大到小排列的面值數,n為需要找的錢數,單位全部為分//輸出:數組num,對照數組m中的面值存放不同面值的硬幣的個數,就找錢方案 public static int[] zhaoqian(int m[],int n) { int k=m.length; int[] num=new int[k]; for(int i=0;i<k;i++) { num<i>=n/m<i>; n=n%m<i>; } return num; }
[Ctrl+A Select All]
演示代碼
Code:
public class zhaoqian{ public static void main(String[] args) { int m[]={25,10,5,1}; int n=99; int[] num=new int[m.length]; num=zhaoqian(m,n); System.out.println(n+"的找錢方案:"); for(int i=0;i<m.length;i++) System.out.println(num<i>+"枚"+m<i>+"面值"); } public static int[] zhaoqian(int m[],int n) { int k=m.length; int[] num=new int[k]; for(int i=0;i<k;i++) { num<i>=n/m<i>; n=n%m<i>; } return num; }}
[Ctrl+A Select All]
演示結果:
falcon@falcon:~/program/java$ javac zhaoqian.java
falcon@falcon:~/program/java$ java zhaoqian
99的找錢方案:
3枚25面值
2枚10面值
0枚5面值
4枚1面值
D. C語言貪心演算法 背包問題
if(k!=i)
t=T[i];
T[i]=T[k];
T[k]=t;
交換操作的三步要用{}括起來,不然只有t=T[i];是if的執行語句
E. C語言關於貪心演算法的(很簡單)
LZ在開始研究ACM嘛?
#include
int
least_num_cash(int
_money)
{
/*直接貪心,能用大張的鈔票盡量用大張的*/
int
ret=0;
while(_money!=0)
{
if(_money>=100)
{
_money-=100;
}
else
if(_money>=50)
{
_money-=50;
}
else
if(_money>=20)
{
_money-=20;
}
else
if(_money>=10)
{
_money-=10;
}
else
if(_money>=5)
{
_money-=5;
}
else
if(_money>=2)
{
_money-=2;
}
else
if(_money>=1)
{
_money-=1;
}
ret++;
}
return
ret;
}
int
main()
{
int
n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
printf("%d\n",least_num_cash(m-n));
}
return
0;
}
F. 求C語言或c++的貪心演算法的例題
比如:
int
a=3,b=4,c;
c=a+++b;
將被解釋為
c=(a++)+b;
而不會被解釋為
c=a+(++b);
貪心演算法的主要意義是從左至右依次解釋最多的符號!
G. 貪心演算法求最優分解 C語言程序
思路:對於一個整數n,無論分成多少個數的和,都是這些數相同或相差最少的時候,它們的積才最大。如,對於數 4, 2 * 2最大;對於9,分成三個數3 * 3 * 3最大,分成兩個數4 * 5最大。。。數學里可以證明。
然後分治法就行了
1,2,3這三個數不可分,本身最大,遇到它們直接返回就行了,其它數分完遞歸調用。
H. 求找零錢問題和背包貪心演算法問題(背包里物體可分解)C語言程序
分數太少了,第一個是動態規劃,第二個是貪心,都挺簡單的
還是給你寫吧
第一題:
#include<stdio.h>
#include<memory.h>
int a[2000],b[200000],n,m,i,j;
int main()
{
scanf("%d",&n);//錢幣種類
for (i=0;i<n;i++)
scanf("%d",&a[i]);//每個錢幣的面值
scanf("%d",&m);//需要計算的錢幣的面值
memset(b,0,sizeof(b));
for (i=0;i<n;i++)
b[a[i]]=1;
for (i=1;i<=m;i++)
for (j=0;j<n;j++)
if (i-a[j]>0)
if (b[i]==0)
{
if (b[i-a[j]]!=0)
b[i]=b[i-a[j]]+1;
}
else
{
if (b[i-a[j]]!=0&&b[i-a[j]]+1<b[i])
b[i]=b[i-a[j]]+1;
}
if (b[m]==0) printf("-1\n");//找不開輸出-1
else printf("%d\n",b[m]);//可以找到交換策略,輸出最小票數
return 0;
}
第二題:
#include<iostream>
#include<algorithm>
using namespace std;
struct good//表示物品的結構體
{
double p;//價值
double w;//重量
double r;//價值與重量的比
}a[2000];
double s,value,m;
int i,n;
bool bigger(good a,good b)
{
return a.r>b.r;
}
int main()
{
scanf("%d",&n);//物品個數
for (i=0;i<n;i++)
{
scanf("%lf%lf",&a[i].w,&a[i].p);
a[i].r=a[i].p/a[i].w;
}
sort(a,a+n,bigger);//調用sort排序函數,你大概不介意吧,按照價值與重量比排序貪心
scanf("%lf",&m);//讀入包的容量m
s=0;//包內現存貨品的重量
value=0;//包內現存貨品總價值
for (i=0;i<n&&s+a[i].w<=m;i++)
{
value+=a[i].p;
s+=a[i].w;
}
printf("The total value in the bag is %.2lf.\n",value);//輸出結果
return 0;
}
I. 收集各類貪心演算法(C語言編程)經典題目
舉個例子,假如你買東西,老闆需要找給你99分錢,他有上面面值分別為25分,10分,5分,1分的硬幣(都是假如,不符合實際),他得找你3個25分,2個10分的,4個1分的才為最佳方案!
用貪心演算法編寫程序實現!
main()
{
int
i,a[5],b[4],c[4];
/*
define
the
type
of
the
money*/
a[1]=25;
a[2]=10;
a[3]=5;
a[4]=1;
printf("please
input
you
money
(fen):\n");
scanf("%d",&b[0]);
for
(i=1;i<=4;i++)
{
b[i]=b[i-1]%a[i];
/*take
n
25
off
and
money
left*/
c[i]=(b[i-1]-b[i])/a[i];
/*
n
*/
printf("%d
is
%d\n",a[i],c[i]);
}
getch();
}
J. 關於一道C語言的背包問題,用的是貪心演算法
#include "iostream.h"
#include "stdio.h"
#include <cstdlib>
struct stone
{
int name;
int weight;//物品的剩餘重量
int weight_t;//物品的重量
float benefit;//物品的價值
//float b;
};
//按物品的效益排序
void sort(stone *data,int num)
{
//僅剩一個元素時排序完畢
if(num<1)
return;
int low=0,high=num;
stone key_s=data[low];//取數組的第一個作為關鍵字
float key=(float)key_s.benefit/key_s.weight;
int empty=low;//目標位置初始位置為low指向的位置
while(low<high)
{
if(low==empty)//後面的指針向前走
{
//找到比關鍵字小的元素把它移到low指向的位置
while((data[high].benefit/data[high].weight<key)&&(high>low))
{
high--;
}
if(data[high].benefit/data[high].weight>=key)
{
data[low]=data[high];
empty=high;
}
}
else if(high==empty)//前面的指針向後走
{
//找到比關鍵字大的元素把它移到high指向的位置
while((data[low].benefit/data[low].weight>=key)&&(low<high))
{
low++;
}
if(data[low].benefit/data[low].weight<key)
{
data[high]=data[low];
empty=low;
}
}
}
data[empty]=key_s;//把關鍵字放到劃分完畢後兩部分的中間位置
//關鍵字前面的數列繼續遞推
if(empty>1)
sort(data,empty-1);
//關鍵字後面的數列繼續遞推
if(num-empty-1>0)
sort(data+empty+1,num-empty-1);
}
//輸入物品的信息
void inputstone(stone *bag,int num)
{
for(int i=0;i<num;i++)
{
bag[i].name=i+1;//物品的名字
printf("請輸入第%d號物品的重量:",i+1);
scanf("%d",&bag[i].weight);
if (bag[i].weight<=0)
{printf("物品的重量必須大於0!\n");}
printf("請輸入第%d號物品的價值:",i+1);
scanf("%f",bag[i].benefit);
if (bag[i].benefit<=0)
{printf("物品的價值必須大於0!\n");}
bag[i].weight_t=bag[i].weight;
}
}
//主函數
int main(int argc, char* argv[])
{ int i;
int num=0;//放入物品的數量
int weight=0;//背包可容納的重量
float benefit=0;//總效益
stone *bag;//物品
/////輸入背包可容納的重量
do
{
printf("請輸入背包可容納的重量:");
scanf("%d",&weight);
if (weight<=0)
printf("背包可容納的重量必須大於0!\n");
}while(weight<=0);
//輸入物品種類
do
{
printf("請輸入物品的數量:");
scanf("%d",&num);
if (num<=0)
printf("物品數量必須大於0!\n");
}while(num<=0);
bag=new stone[num];//物品數組
inputstone(bag,num);//輸入物品的信息
sort(bag,num-1);//按單位效益排序
for(i=0;i<num&&weight>0;i++)
{
stone *temp=bag+i;
if(weight>=temp->weight)
{
weight-=temp->weight;
temp->weight=0;
benefit+=temp->benefit;
continue;
}
else
{
temp->weight-=weight;
weight=0;
benefit+=(temp->benefit*(1-(float)temp->weight/temp->weight_t));
break;
}
}
////////輸出結果//////////
printf("物品種類 放入的比例 每單位效益 ");
for(i=0;i<num;i++)
{
stone *temp=bag+i;
printf("%d類物品",temp->name);
printf("\t\t%.2f\t\t",(temp->weight_t-temp->weight)/(float)temp->weight_t);
printf(" %.4f\n",temp->benefit/(float)temp->weight_t);
}
printf("總效益:%.2f",benefit);
delete bag;
getchar();
system("PAUSE");
return EXIT_SUCCESS;
return 0;
}