You are on page 1of 11

Bài 1 Viết chương trình tìm dãy con có tổng lớn nhất (tìm tổng và in dãy con đó)

bằng phương pháp


duyệt qua tất cả các dãy con

#include <iostream> cout << "Day co tong max =" << max << ", ";

using namespace std; cout<<"Day con do la:\n";

void duyetall(int a[],int n) for(int i=vt1;i<=vt2;i++)

{ {

int max=INT_MIN; cout<<a[i]<<"\t";

int sum=0; }

int vt0=0,vt1=0,vt2=0; }

for(int i=0;i<n;i++) int main()

{ {

if(sum+a[i]<a[i]) int a[6] = { -2, 11, -4, 13, -5, 2};

{ int n=6;

vt0=i; duyetall(a,n);

sum=a[i]; }

else {

sum=sum+a[i];

if(max<sum)

max=sum;

vt1=vt0;

vt2=i;

Bài 2 : Viết chương trình tìm dãy con có tổng lớn nhất (tìm tổng và in dãy con đó) bằng phương pháp
chia để trị.
#include <iostream> sum = 0;

using namespace std; for(int i=mid+1;i<=phai;i++)

int chiatri(int a[],int trai,int phai) {

{ sum+=a[i];

if (phai <= trai) { if(sum>maxphai)

return a[trai]; maxphai=sum;

} }

int mid = (phai+trai)/2; int maxtraiphai = max(chiatri(a, trai,


mid),chiatri(a, mid + 1, phai));
int maxtrai=INT_MIN;
return max(maxtraiphai, maxtrai + maxphai);
int sum=0;
}
for(int i=mid ; i>=trai;i--)
int main()
{
{
sum+=a[i];
int s[6] = {-2, 11, -4, 13, -5, 2 };
if(sum>maxtrai)
int n = sizeof(s)/sizeof(s[0]);
maxtrai=sum;
cout<<"max = "<<chiatri(s, 0, n - 1);
}
}
int maxphai = INT_MIN;

Bai 3 Viết chương trình tìm dãy con có tổng lớn nhất (tìm tổng và in dãy con đó) bằng phương pháp quy
hoạch động
#include <iostream>
using namespace std;
int quyhoachdong(int a[],int n)
{
int sum=0;
int maxx=0;
for(int i=0;i<n;i++)
{
sum+=a[i];
sum=max(sum,0);
maxx=max(sum,maxx);
}
return maxx;
}
int main()
{
int s[6] = {-2, 11, -4, 13, -5, 2 };
int n = sizeof(s)/sizeof(s[0]);
cout<<"\nmax = "<<quyhoachdong(s, n);
}
Bài 4: Viết chương trình sắp xếp một dãy sử dụng thuật toán sắp xếp chọn.
#include <iostream> int main()

using namespace std; {

void xuat(int A[],int n){ int A[]={64, 25, 12, 22, 11};

for(int i=0;i<n;i++) int n=sizeof(A)/sizeof(A[0]);

{ sapxepchon(A,n);

cout<<A[i]<<"\t"; }

void sapxepchon(int A[],int n)

for(int i=0;i<n-1;i++)

int min = i;

for(int j=i+1;j<n;j++)

if(A[j]<A[min])

min=j;

swap(A[min],A[i]);

xuat(A,n);

Bài 5: Viết chương trình sắp xếp một dãy sử dụng thuật toán sắp xếp chèn
#include <iostream> while (j >= 0 && a[j] > key)

using namespace std; {

void xuat(int a[],int n){ a[j+1] = a[j];

for(int i=0;i<n;i++) j = j-1;

{ }

cout<<a[i]<<"\t"; a[j+1] = key;

} }

} xuat(a,n);

void sapxepchen(int a[],int n) }

{ int main()

int i, key, j; {

for (i = 1; i < n; i++) int A[]={64, 25, 12, 22, 11};

{ int n=sizeof(A)/sizeof(A[0]);

key = a[i]; sapxepchen(A,n);

j = i-1; }

Bài 6: Viết chương trình sắp xếp một dãy sử dụng thuật toán sắp xếp trộn (merge sort)
#include<stdlib.h> void mergeSort(int arr[], int l, int r)

#include<iostream> {

using namespace std; if (l < r)

void merge(int arr[], int l, int m, int r) {

{ int m = l+(r-l)/2;

int i, j, k; mergeSort(arr, l, m);

int n1 = m - l + 1; mergeSort(arr, m+1, r);

int n2 = r - m; merge(arr, l, m, r);

int L[n1], R[n2]; }

void xuat(int A[], int size)


for (i = 0; i < n1; i++) {

L[i] = arr[l + i]; int i;

for (j = 0; j < n2; j++) for (i=0; i < size; i++)

R[j] = arr[m + 1+ j]; cout<<A[i]<<" ";

cout<<endl;

i = 0; }

j = 0; int main()

k = l; {

while (i < n1 && j < n2) int arr[] = {12, 11, 13, 5, 6, 7};

{ int arr_size = sizeof(arr)/sizeof(arr[0]);

if (L[i] <= R[j])

{ cout<<"mang truoc khi sap xep\n";

arr[k] = L[i]; xuat(arr, arr_size);

i++;

} mergeSort(arr, 0, arr_size - 1);

else

{ cout<<"mang sau khi sap xep\n";

arr[k] = R[j]; xuat(arr, arr_size);

j++; return 0;

} }

k++;

while (i < n1)

arr[k] = L[i];

i++;

k++;
}

while (j < n2)

arr[k] = R[j];

j++;

k++;

Bài 7: Viết chương trình sắp xếp một dãy sử dụng thuật toán heap sort.
#include <iostream> void heapSort(int arr[], int n)

using namespace std; {

for (int i = n / 2 - 1; i >= 0; i--)

void heapify(int arr[], int n, int i) heapify(arr, n, i);

int largest = i; for (int i=n-1; i>0; i--)

int l = 2*i + 1; {

int r = 2*i + 2; swap(arr[0], arr[i]);

heapify(arr, i, 0);

if (l < n && arr[l] > arr[largest]) }

largest = l; }

void xuat(int arr[], int n)

if (r < n && arr[r] > arr[largest]) {

largest = r; for (int i=0; i<n; ++i)

cout << arr[i] << " ";

if (largest != i) cout << "\n";

{ }

swap(arr[i], arr[largest]);
heapify(arr, n, largest); int main()

} {

} int arr[] = {12, 11, 13, 5, 6, 7};

int n = sizeof(arr)/sizeof(arr[0]);

cout << "mang truoc khi sap xep: \n";

xuat(arr, n);

heapSort(arr, n);

cout << "mang sau khi sap xep: \n";

xuat(arr, n);

Bài 8: Sử dụng thuật toán chia để trị viết chương trình tính hàm an
#include <iostream>

using namespace std;

int pow(int a, int n)

if(n == 1) {

return a;

} else {

int temp = pow(a, n/2);

if(n % 2 == 0)

return temp * temp;

else

return temp * temp * a;

int main()
{

int a=2;

int n=6;

cout<<a<<"^"<<n<<" = "<<pow(a,n);

Bài 9: Bài toán chia bánh : Bài toán mô tả như sau: Có N chiếc bánh, mỗi chiếc bánh có bán kính là ri
(tương ứng với chiếc bánh thứ i). Tất cả N chiếc bánh có chiều cao bằng nhau và bằng 1. Cần phải chia
cắt N chiếc bánh thành F miếng bánh thỏa mãn điều kiện là F miếng bánh có thể tích là bằng nhau để
chia cho F người. Tìm thể tích lớn nhất của mỗi miếng bánh có thể chia được.

Bài 10: ATM with draw Cho các mệnh giá tiền: 1000, 2000, 3000, 5000, 1000.101 , 2000.101 , 3000.101 ,
5000.101 , 1000.102 , …., 1000.10c , 2000.10c , …., 5000.10c . c là số nguyên Nhập vào số tiền mặt W cần
rút. Viết chương trình cho biết số tờ rút là nhỏ nhất.
#include <iostream> void xuat(int atm[],int n)

#include <cmath> {

using namespace std; for(int i=0;i<n;i++)

void nhap(int atm[],int c,int &n) cout<<atm[i]<<endl;

{ }

int vt=0; }

for(int i=1;i<=5;i++) void ruttien(int atm[],int n,int tien)

{ {

for(int j=0;j<c;j++) cout<<"so tien rut duoc la:"<<endl;

{ for(int i=0;i<n;i++)

{
atm[vt]=i*1000*pow(10,j);
int t=tien/atm[i];
vt++;
tien-=t*atm[i];
n++;
if(t>0)
}
cout<<"menh gia: "<<atm[i]<<"\
} tso luong: "<<t<<endl;

} }
void sapxep(int atm[],int n) }

{ int main()

for(int i=0;i<n-1;i++) {

{ int atm[100];

for(int j=i+1;j<n;j++) int c=3;

{ int n=0;

if(atm[i]<atm[j]) nhap(atm,c,n);

swap(atm[i],atm[j]); sapxep(atm,n);

} int tien;

} cout<<"Nhap so tien can rut: ";

} cin>>tien;

ruttien(atm,n,tien);

Bài 11: Bài toán trồng cây Cho n hạt giống có số ngày ra hoa tương ứng là d1, d2, …, dn. Một bác nông
dân trồng mỗi ngày một hạt giống. Viết chương trình tìm số ngày sớm nhất để bác nông dân tổ chức bữa
tiệc ngoài vườn khi tất cả các hạt giống này đã trưởng thành và nở hoa.
#include<iostream> void ThuTuTrong(Hoa hoa[],int n)

#include<string> {

using namespace std; cout<<"Thu tu trong ca loai hoa la:\n";

struct Hoa { for(int i = 1;i <= n; i++)

char Ten[100]; {

int NgayRaHoa; cout<<"Ngay thu "<<i<<"


trong cay "<<hoa[i].Ten<<endl;
};
}
void SapXep(Hoa hoa[],int n)
}
{
void Greedy(Hoa hoa[],int n)
for(int i = 1; i <= n - 1; i++)
{
for(int j = i + 1; j <= n; j++)
int min=0;
if (hoa[i].NgayRaHoa < hoa[j].NgayRaHoa)
for (int i = 1; i <= n; i++) {
swap(hoa[i], hoa[j]);
int ngay = hoa[i].NgayRaHoa + i;
} if(ngay>min)

void Nhap(Hoa hoa[],int n) min=ngay;

{ }

for(int i = 1; i <= n; i++) cout<<"So ngay som nhat de tat ca hoa deu no
la:= "<<min + 1;
{
}
cout<<"Loai hat giong thu
"<<i<<" :\n"; int main()

cout<<"Ten loai hoa : "; {

fflush(stdin); int n;

gets(hoa[i].Ten); cout<<"Nhap so hat giong n:= ";

cout<<"Ngay ra hoa : cin>>n;


";cin>>hoa[i].NgayRaHoa;
Hoa *hoa=new Hoa[n];
}
Nhap(hoa,n);

SapXep(hoa,n);
}
cout<<"\n----------------------------------\n";

ThuTuTrong(hoa,n);

Greedy(hoa,n);

Bài 13: Cho 1 chuỗi (xâu kí tự). Một chuỗi con là chuỗi còn lại sau khi bỏ đi một hoặc vài kí tự từ xâu ban
đầu. Ví dụ x=”abcfghk”, nếu bỏ đi kí tự ‘b’ thì xâu con là ‘acfghk’. Nếu bỏ đi kí tự ‘bc’ và’gh’ thì xâu con là
‘afk’. Viết chương trình nhập vào hai xâu kí tự, in ra độ dài xâu con chung lớn nhất và xâu chung đó của
hai xâu vừa nhập. Ví dụ: hai xâu “BACDB” và “BDCB”, xâu con chung lớn nhất có độ dài là 3 và là “BCB”

#include<iostream> max_Size = L[n][m];


#include<string> int i = n;
using namespace std; int j = m;
while(L[i][j] != 0){
void XauConDaiNhat(string a, string if(a[i-1] == b[j-1]){
b){ xaucon += a[i-1];
int n = a.size(); i--;
int m = b.size(); j--;
int max_Size; }
string xaucon = ""; else{
int L[n+1][m+1]; if(L[i-1][j] >= L[i][j-
1])
for(int i=0; i<=n; i++) i--;
L[i][0] = 0; else
for(int j=0; j<=m; j++) j--;
L[0][j] = 0; }
}
for(int i = 1; i<=n; i++){
for(int j = 1; j<=m; j++){ cout<<"Do dai xau lon nhat:
if(a[i-1] == b[j-1]){ "<<max_Size<<endl;
L[i][j] = L[i-1][j- cout<<"Xau con: ";
1] + 1; for(int t = max_Size-1 ; t>=0;
} t--)
else{ cout<<xaucon[t];
if(L[i-1][j] >= }
L[i][j-1]) int main(){
L[i][j] = L[i- string a, b;
1][j]; cout<<"Nhap xau a: "; cin>>a;
else cout<<"Nhap xau b: "; cin>>b;
L[i][j] = L[i] XauConDaiNhat(a,b);
[j-1]; return 0;
} }
}
}

You might also like