1. 貪心演算法求最優分解 C語言程序
思路:對於一個整數n,無論分成多少個數的和,都是這些數相同或相差最少的時候,它們的積才最大。如,對於數 4, 2 * 2最大;對於9,分成三個數3 * 3 * 3最大,分成兩個數4 * 5最大。。。數學里可以證明。
然後分治法就行了
1,2,3這三個數不可分,本身最大,遇到它們直接返回就行了,其它數分完遞歸調用。
2. C語言問題2
我將上面的程序改成了如下程序:
1 #include <stdio.h>
2 func(int a,int b)
3 {return a+b;}
4
5 int main()
6 {
7 int x=6,y=7,z,j,k;
8 z=func(j=func(x++,y++),k=func(--x,--y));
9 printf("%d\t%d\t%d\n",j,k,z);
10 }
THE KEY:11 、11、 22。
程序運行的結果之所以會是這樣:是C的++X和X++、--X和X--編譯執行不同。
建議了解C的自加(減),C程序的運行。
3. c語言貪心演算法智力大沖浪與花生採摘兩題
都是用C++寫的,不建議只用純C語言
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
struct Riddle {
int time;
int money;
};
struct gt{
bool operator()(Riddle& opl, Riddle& opr){
return opl.money > opr.money;
}
};
int main()
{
int m, n;
ifstream fin("riddle.in");
fin >> m >> n;
Riddle * riddles = new Riddle[n];
for (int i=0; i<n; ++i) {
fin >> riddles[i].time;
}
for (int i=0; i<n; ++i) {
fin >> riddles[i].money;
}
sort(riddles, riddles+n, gt() );
int * ridorder = new int[n];
for (int i=0; i<n; ++i) {
ridorder[i] = 0;
}
for (int i=0; i<n; ++i) {
int j;
for (j=riddles[i].time-1; j>=0 && ridorder[j]!=0; --j) {}
if (j >= 0) ridorder[j] = 1;
else m -= riddles[i].money;
}
cout << m << endl;
}
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 55
struct Peanut
{
int x, y, num;
}peanut[maxn * maxn];
int n, m, t, pcount;
bool operator < (const Peanut &a, const Peanut &b)
{
return a.num > b.num;
}
void input()
{
pcount = 0;
scanf("%d%d%d", &n, &m, &t);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
int a;
scanf("%d", &a);
if (a)
{
peanut[pcount].x = i + 1;
peanut[pcount].y = j + 1;
peanut[pcount].num = a;
pcount++;
}
}
}
void work()
{
int nowtime = peanut[0].x + 1;
if (nowtime + peanut[0].x > t)
{
printf("0\n");
return;
}
int ans = peanut[0].num;
for (int i = 1; i < pcount; i++)
{
nowtime += abs(peanut[i].x - peanut[i - 1].x) + abs(peanut[i].y - peanut[i - 1].y) + 1;
if (nowtime + peanut[i].x > t)
break;
ans += peanut[i].num;
}
printf("%d\n", ans);
}
int main()
{
//freopen("t.txt", "r", stdin);
int t;
scanf("%d", &t);
while (t--)
{
input();
sort(peanut, peanut + pcount);
work();
}
return 0;
}
4. 怎樣應用貪心演算法求得最優解
動態規劃要求。。具有最優子結構,記f[i]最優時,f[i - 1]的解也最優。。。最終可以得到最優解
貪心演算法,一般只能得到近優解或者局部最優解。。
5. 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(
6. 求C語言高手 多機調度問題 ,設計個程序 要C語言版的 不要C++的 謝謝啊
#include<stdio.h>
#define N 10
typedef struct node
{
int ID,time;
}jobnode;
typedef struct Node
{
int ID,avail;
}manode;
manode machine[N];
jobnode job[N];
manode* Find_min(manode a[],int m)
{
manode* temp=&a[0];
for(int i=1;i<m;i++)
{
if(a[i].avail<temp->avail)
temp=&a[i];
}
return temp;
}
void Sort(jobnode t[],int n)
{
jobnode temp;
for(int i=0;i<n-1;i++)
for(int j=n-1;j>i;j--)
{
if(job[j].time>job[j-1].time)
{
temp=job[j];
job[j]=job[j-1];
job[j-1]=temp;
}
}
}
void main()
{
int n,m,temp;
manode* ma;
printf("輸入作業數目(作業編號按輸入順序處理)\n");
scanf("%d",&n);
printf("輸入相應作業所需處理時間:\n");
for(int i=0;i<n;i++)
{
scanf("%d",&job[i].time);
job[i].ID=i+1;
}
printf("輸入機器數目(機器編號按輸入順序處理)\n");
scanf("%d",&m);
for(i=0;i<m;i++)
{
machine[i].ID=i+1;
machine[i].avail=0;
}
putchar('\n');
if(n<=m)
{
printf("為每個作業分配一台機器,可完成任務!\n");
return;
}
Sort(job,n);
for(i=0;i<n;i++)
{
ma=Find_min(machine,m);
printf("將機器: %d 從 %d -----> %d 的時間段分配給作業: %d\n",ma->ID,ma->avail,ma->avail+job[i].time,job[i].ID);
ma->avail+=job[i].time;
}
temp=machine[0].avail;
for(i=1;i<m;i++)
{
if(machine[i].avail>temp)
temp=machine[i].avail;
}
putchar('\n');
printf("該批作業處理完成所需加工時間為: %d\n",temp);
}
剛寫的,試過了,運行通過.主要運用貪心演算法,應該算比較典型的吧,呵呵,該睡覺了,明天還有考試呢,希望對你有幫助!共同進步哈!
7. 很簡單的C語言貪心演算法,用map做的,但我對map有個問題
改成 pw.insert(make_pair(5,10));