當前位置:首頁 » 編程語言 » c語言農夫規劃月度開銷
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言農夫規劃月度開銷

發布時間: 2022-06-08 07:31:46

c語言問題

#define MAX_STEP 20 // 宏定義
int a[MAX_STEP][4]; // 全局變數定義
int b[MAX_STEP]; // 同上
char *name[] = // 同上
void search(int iStep) // 函數聲明

Ⅱ 幾題簡單的C語言編程

//第3題
#include<iostream>
using namespace std;
int main()
{
char x;
int tmp;
cout<<"請輸入x(0~255):"<<endl;
cin>>tmp;
while(tmp>255)
{
cout<<"x不能大於255,請重新輸入"<<endl;
cin>>tmp;
}
x=tmp;
cout<<"y=(1+x)/x^2="<<(1+x)/(x*x)<<endl;
return 0;
}
//第4題
#include<iostream>
using namespace std;
int main()
{
int x,y;
cin>>x;
if(x<1)
{
y=x;
}
else if(x<10)
{
y=2*x-1;
}
else
{
y=3*x-11;
}
cout<<y<<endl;
return 0;
}
//第5題
#include<iostream>
using namespace std;
int FibonacciDen(int x)
{
if(x==1)
{
return 1;
}
else if(x==2)
{
return 2;
}
else
{
return FibonacciDen(x-1)+FibonacciDen(x-2);
}
return 0;
}
int FibonacciNum(int x)
{
if(x==1)
{
return 2;
}
else if(x==2)
{
return 3;
}
else
{
return FibonacciNum(x-1)+FibonacciNum(x-2);
}
return 0;
}
#define M 20
int main()
{
float den[M],num[M];
float sum=0;
for(int i=0;i<M;i++)
{
den[i]=FibonacciDen(i+1);
num[i]=FibonacciNum(i+1);
sum+=num[i]/den[i];
}
cout<<sum<<endl;
}
//第6題
#include<iostream>
using namespace std;
int main()
{
int s[10]={0,1,2,3,4,5,6,7,8,9};
int max=s[0],k;
for(int i=0;i<9;i++)
{
max=s[i];
for(int j=i;j<10;j++)
{
if(s[j]>max)
{
max=s[j];
k=j;
}
}
if(max!=s[i])
{
swap(s[i],s[k]);
}
}
for(int i=0;i<10;i++)
{
cout<<s[i]<<" ";
}
}
//第7題
#include<iostream>
using namespace std;
int FindMax(int *p,int size)
{
int max=*p;
for(int i=0;i<size;i++)
{
if(*(p+i)>max)
{
max=*(p+i);
}
}
return max;
}
int main()
{
int s[4][4]={1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5};
for(int i=0;i<4;i++)
{
cout<<FindMax(s[i],sizeof(s[i])/sizeof(int))<<" ";
}
cout<<endl;
return 0;
}
//第8題
#include<iostream>
using namespace std;
int fun(int n)
{
if(0==n||1==n)
{
return 1;
}
else
{
return n*fun(n-1);
}
}

int main()
{
int n;
cin>>n;
cout<<fun(n)<<endl;
return 0;
}
//第9題
#include<iostream>
using namespace std;
int fc(int *p,int size)
{
int odd=0;
for(int i=0;i<size;i++)
{
if(*(p+i)%2)
{
odd++;
}
}
return odd;
}
int main()
{
int a[5]={1,2,3,4,5},odd,size;
size=sizeof(a)/sizeof(int);
odd=fc(a,size);
cout<<"奇數個數:"<<odd<<endl<<"偶數個數:"<<size-odd<<endl;
return 0;
}
//第10題
#include<iostream>
using namespace std;
int main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int *p=a;
for(int i=0;i<10;i++,p++)
{
cout<<*p<<" ";
}
cout<<endl;
return 0;
}
//第11題
#include<iostream>
using namespace std;
int main()
{
char a[]="Hello";
char b[]="World";
char *pa=a;
char *pb=b;
for(int i=0;a[i]!='\0';i++)
{
*(pb+i)=*(pa+i);
}
cout<<b<<endl;
return 0;
}
//挺簡單,但挺多的,呵呵!建議你還是自己練一下比較有收獲!祝你能學好C語言!

Ⅲ 如何用c語言編程實現動態規劃

動態規劃主要是 狀態 & 狀態轉移方程 如果轉移方程寫出來了 程序就自然出來啦

對於這題 dp[i][j] 表示 走到格子 (i,j) 時 的總和最大值 val[i][j] 表示格子 (i, j) 的值

那麼有 dp[i][j] = max( dp[i-1][j] , dp[i][j-1]) + val[i][j];
當然 邊界的時候要特殊考慮一下

for(int i = 1; i <= m ; i++)
for(int j = 1; j <= n; j++)
{
if( i == 1 ) ....;
else if( j == 1 ) ....;
else dp[i][j] = max( dp[i-1][j] , dp[i][j-1]) + val[i][j];
}
最後 dp[m][n] 就是答案啦 ^ ^

Ⅳ 農夫過河問題、用C語言解決。。最好能有詳細代碼和注釋。。。感激不盡,。。。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STEP 20

//index: 0 - 狼,1-羊,2-菜,3-農夫,value:0-本岸,1-對岸
int a[MAX_STEP][4];
int b[MAX_STEP];

char *name[] = { "空手", "帶狼", "帶羊", "帶菜" };
void search(int iStep) { int i; if (a[iStep][0] + a[iStep][1] + a[iStep][2] + a[iStep][3] == 4) { for (i = 0; i < iStep; i++) { if (a[i][3] == 0) { printf("%s到對岸\n", name[b[i] + 1]); } else { printf("%s回本岸\n", name[b[i] + 1]); } } printf("\n"); return; } for (i = 0; i < iStep; i++) { if (memcmp(a[i], a[iStep], sizeof(a[i])) == 0) { return; } } if (a[iStep][1] != a[iStep][3] && (a[iStep][2] == a[iStep][1] || a[iStep][0] == a[iStep][1])) { return; } for (i = -1; i <= 2; i++) { b[iStep] = i; memcpy(a[iStep + 1], a[iStep], sizeof(a[iStep + 1])); a[iStep + 1][3] = 1 - a[iStep + 1][3]; if (i == -1) { search(iStep + 1); } else if (a[iStep][i] == a[iStep][3]) { a[iStep + 1][i] = a[iStep + 1][3]; search(iStep + 1); } } } int main() { search(0); return 0; }

Ⅳ c語言動態規劃的一個問題

動態規劃關鍵是找到問題中的子問題,寫出狀態方程。
這個問題的子問題可以定義為前n件物品,總費用為v的最大價值總和。
先考慮第n件物品,如果c[n]<v的話,它有兩種選擇,放入背包和不放入背包。它的價值為w[n]*i(i為0或1),費用c[n]*i(i為0或1),則還需要從n-1件物品中選擇費用為v-c[n]*i物品的最大價值總和,所以狀態方程為:
f(n,v)=max{f(n-1,v-c[n]*i)+w[n]*i};i根據物品費用和對應的總費用確定取值,即小於對應的總費用時可取0,1,否則為0。
很明顯最簡單的是從前1件物品中選取,這個就是最後用遞歸程序編寫程序時候的出口。
演算法思想就是上面所寫的。程序的精華在於思想,僅供你編程參考。

Ⅵ C語言-動態規劃

#include <stdio.h>
#include <stdlib.h>

​struct tree {
int value;
struct tree *left;
struct tree *right;
};

#define min(x, y) x < y ? x : y

int a[3][3] = {10, 9, 14, 9, 12, 10, 6, 5, 8};

void add_tree_node(struct tree **node, int x, int y, int depth)
{
// printf("x = %d, y = %d, value = %d, depth = %d\n", x, y, a[x][y], depth);
*node = (struct tree *)malloc(sizeof(struct tree));
((struct tree *)*node)->value = a[x][y] + a[x][x];
if(depth == 1) {
((struct tree *)*node)->left = ((struct tree *)*node)->right = NULL;
return;
} else {
add_tree_node(&(((struct tree *)*node)->left), y, (y+1)%3, depth-1);
add_tree_node(&(((struct tree *)*node)->right), y, (y+2)%3, depth-1);
}
depth--;
}

void print_tree(struct tree *t)
{
if(t == NULL)
return;
printf("%d ", t->value);
print_tree(t->left);
print_tree(t->right);
}

void free_tree(struct tree *t)
{
if(t == NULL)
return;
free_tree(t->left);
free_tree(t->right);
free(t);
}

int get_short_time(struct tree *t)
{
if(t->left == NULL || t->right == NULL)
return t->value;
return(min(get_short_time(t->left), get_short_time(t->right))+t->value);
}
void main()
{
struct tree *root;
int i, j, minx=0, miny=1;
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
if(i != j && a[minx][miny] > a[i][j])
minx = i, miny = j;
printf("拆卸時間最短的是從第%d套儀器換為第%d套儀器,時間為%d\n", minx+1, miny+1, a[minx][miny]);

// 創建深度為5的二叉樹,將做5次試驗的全部可能路徑都放到二叉樹中
add_tree_node(&root, minx, miny, 5);
print_tree(root);
printf("\n");
printf("最短可以完成全部實驗的時間是:%d\n", get_short_time(root));
free_tree(root);
}

Ⅶ C語言,農夫過河問題

程序就是求解農夫過河問題:
農夫帶著一狼,一羊和一些菜過河。河邊只有一船,一次農夫只能帶一樣東西。無人時,狼要吃羊,羊要吃菜,程序將找出所有農夫過河的方案。

首先要表示狼,羊,菜和農夫所在的位置,4者的位置有本岸和對岸兩種情況,分別用0和1表示,4者,所以用一個有4元素的數組。為了要記錄每一步,程序中使用了一個二維數組a[MAX_STEP][4],記錄每一步4者所在位置。第一步就是a[0],第二布是a[1]...而,a[0][0]就表示第一步狼在本岸(0)還是對岸(1),a[0][1]表示第一步羊在本岸還是對岸......
為了記錄每一次農夫過河時的狀態,使用了一個數組b[MAX_STEP],數組中的元素的值可能為-1, 0, 1, 2,分別表示農夫在過河時,是空手,帶狼,帶羊,帶菜。

第一步的狀態是狼,羊,菜和農夫都在本案,所以a[0][0]到a[0][3]都是0,本來應該初始化一下,但a是全局變數,所以自動初始化為0,所以程序中省下了這一步。
search是一個遞歸函數,通過不斷的查找可能的下一步,找出一個方案,是一種深度優先搜索。
a[iStep][0] + a[iStep][1] + a[iStep][2] + a[iStep][3] == 4意味著第 iStep時,a[iStep][0]到a[iStep][3]都為1,表示4者都到了對岸。所以輸出結果。
for (i = 0; i < iStep; i++)
{
if (a[i][3] == 0)
{
printf("%s到對岸\n", name[b[i] + 1]);
}
else
{
printf("%s回本岸\n", name[b[i] + 1]);
}
}
輸出每一步
a[i][3]是農夫在本岸還是對岸,如果為0,在本岸,下一步肯定是到對岸,所以列印"...到對岸",而name[b[i]+1]找出對應帶的東西的描述。
for (i = 0; i < iStep; i++)
{
if (memcmp(a[i], a[iStep], sizeof(a[i])) == 0)
{
return;
}
}
判定是否會死循環,如果當前狀態在以前出現過,那麼就會出現死循環。用當前這步的狀態a[iStep]和以前的所有步a[i] (i=0; i <iStep; i++)比較。memcmp是內存比較函數,可以用於比較數組,返回值為0,表示數組中所有值相同。
如果相同,就直接返回,不再查找。

if (a[iStep][1] != a[iStep][3] && (a[iStep][2] == a[iStep][1] || a[iStep][0] == a[iStep][1]))
{
return;
}

判定羊會吃菜,或狼會吃羊的情況。
當農夫和羊在一起的時候,狼不會吃羊,羊也不會吃菜,所以只有當農夫和羊不在一起(a[iStep][1] != a[iStep][3])時,才可能發生「吃」的狀態。
而且「吃」的情況必須是在菜和羊在一起(a[iStep][2] == a[iStep][1])或者羊和狼在一起(a[iStep][0] == a[iStep][1])
發生吃的情況是,返回,不再查找。

for (i = -1; i <= 2; i++)
{
b[iStep] = i;
memcpy(a[iStep + 1], a[iStep], sizeof(a[iStep + 1]));
a[iStep + 1][3] = 1 - a[iStep + 1][3];
if (i == -1)
{
search(iStep + 1);
}
else if (a[iStep][i] == a[iStep][3])
{
a[iStep + 1][i] = a[iStep + 1][3];
search(iStep + 1);
}
}
但現在,已經確保了上一步是「安全」的,可以繼續查找。
-1, 0, 1, 2分別表示渡河時4種情況,空手,帶狼,帶羊,帶菜。
memcpy(a[iStep + 1], a[iStep], sizeof(a[iStep + 1])); 復制當前步的數組到下一步。
農夫的狀態肯定會發生改變,所以a[iStep + 1][3] = 1 - a[iStep + 1][3]; 因為當a為0或1時,a = 1 - a會使a在0和1之間切換。
如果i== -1,表示空手,狼,羊,菜的狀態都不會發生改變,所以直接搜索下一步(search(iStep + 1); )
否則要被帶過去的東西(0, 1, 2分別表示0, 1, 2)的狀態需要改變。
要帶的東西必須和農夫同在本案或對岸(a[iStep][i] == a[iStep][3]),才可能帶得了。只有在這種情況下,使要帶的東西的狀態和農夫相同(a[iStep + 1][i] = a[iStep + 1][3];),並開始下一步的搜索(search(iStep + 1))。

Ⅷ C語言動態規劃

定義 d(a, b) 為原字元串中從第 a 個字元開始,包含 b 個阿拉伯數字的數。
定義 s(in, ik) 為以下情況中,最後一個 * 前面 ik 個數的最大乘積:插入 ik + 1 個 * ,最後一個 * 前面有 in + 1 個阿拉伯數字。
則:
s(in, 0) = d(0, in + 1);
s(in, ik) = min{ s(ip, ik - 1) * d(ip + 1, in - ip) } (其中 ip = 0, 1, 2, ..., in - 1);
題目結果則是 s(n - 1, k + 1) 。

下面是程序,CUnsignedBigNumber 我現寫的,可以的話就隨便搞一個吧,實在不行我這個再給你。

#include <iostream>
#include <stdlib.h>

CUnsignedBigNumber BiggestProct(unsigned int n, unsigned int k, const char * digits)
{
if (n <= k)
return CUnsignedBigNumber();

CUnsignedBigNumber * intermediateResults = new CUnsignedBigNumber[n * k];
unsigned int ik, in, ip;

for (in = 0; in < n; ++in) // 這里求每個 s(in, 0)
intermediateResults[in].set(digits, in + 1); // d(0, in + 1)

for (ik = 1; ik < k; ++ik)
{
for (in = 0; in < n; ++in)
{
CUnsignedBigNumber & current = intermediateResults[ik * n + in]; // s[in, ik]
for (ip = 0; ip < in; ++ip)
{
CUnsignedBigNumber temp(digits + ip + 1, in - ip); // d(ip + 1, in - ip)
temp *= intermediateResults[(ik - 1) * n + ip]; // d(ip + 1, in - ip) * s(ip, ik - 1)
if (current < temp)
current.swap(temp); // current = temp;
}
}
}

CUnsignedBigNumber result; // s[n - 1, k + 1]
for (ip = 0; ip < in; ++ip)
{
CUnsignedBigNumber temp(digits + ip + 1, n - 1 - ip));
temp *= intermediateResults[(k - 1) * n + ip];
if (result < temp)
result.swap(temp);
}

delete [] intermediateResults;
return result;
}

int main(void)
{
unsigned int n = 0, k = 0;
char digits[21];
scanf("%d%d%s", &n, &k, digits);

std::cout << BiggestProct(n, k, digits) << std::endl;

system("pause");
return 0;
}

Ⅸ C語言學習規劃

只要你能夠將這一本教材的例子與練習做完,基本上考二級就沒有問題了。不過,上來的茫然不知所措的感覺,你能否挺過?挺過這一關,只要你肯學,學會應當不難。

Ⅹ 關於C語言學習計劃

把Kernighan和Ritchie的 The C Programming Language這本書(238頁,ANSI C)看一遍就差不多了,這時候你寫不了什麼實用的程序(天才,一點就通的人例外)。

接下來你需要根據興趣愛好或職業規劃等來給自己選一個發展方向。如果急著靠它找工作,那麼就看看Windows,它入門快,很快就可以參與到求職競爭中去(這輩子也很可能局限於此)。

如果並不是急著用C來打扮自己,那麼建議看看Linux Programming Unleashed,然後根據更細的發展方向去看LDD、LKD或Linux應用編程等內容,這些東西入門稍有難度(只是稍有難度而已,別被那些沒耐性的Windows菜鳥給嚇著)。Linux搭配C語言應用范圍很廣,這類人在國內算是高端人才,不愁嫁的。

C語言是一個實用技術,本身的內容並不多,主要的學習精力將會用在各種各樣的庫函數上面,而各種庫函數往往有各自的適用范圍,不可能也沒必要甚至不應該亂學一氣(庫函數確實很多,亂學很容易造成混亂)。

總的來說,我的建議就是先看一遍The C Programming Language,然後給自己選一個發展方向,看那個方向適用的一些函數庫,如果還有精力,再看看Autotools工具包。