การหาค่าต่ำสุดของนิพจน์พีชคณิต
นี่คือโปรแกรม C++ หาค่าต่ำสุดของนิพจน์พีชคณิตรูปแบบ (x1 + x2 + ... + xa) * (y1 + y2 + ... + yb) โดยมีจำนวนเต็ม (a + b) ตัว พิจารณาการจัดหมู่ทั้งหมด แล้วหาค่าต่ำสุด
อัลกอริทึม
Begin
ฟังก์ชัน MinValue():
พารามิเตอร์: a[] = อาเรย์เก็บสมาชิก, x, y = จำนวนเต็ม
1) หาผลรวมของอาเรย์
2) เริ่มต้น s = 0
3) วนลูป i = 0 ถึง (x+y-1) เลข shift 25 เพื่อให้เป็นบวก
4) ประกาศอาเรย์ boolean p[i][j] แทนว่า sum j ถึงได้โดยเลือก i ตัว
5) เริ่มต้นอาเรย์
6) วนลูป i = 0 ถึง (x+y)-1 ถ้า p[i][j] จริง แสดงว่าเลือก i ตัวจาก (x+y) ได้ผลรวม j
7) เริ่มต้น min_value = INF
8) วนลูป i = 0 ถึง (MAX*MAX+1)-1 ถ้า p[x][i] จริง
หาผลรวมจริง (เพราะ shift 25) คำนวณ min_value = min(min_value, tmp * (s - tmp))
9) แสดง min_value
End
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
#define INF 1e9
#define MAX 25
int MinValue(int a[], int x, int y) {
int s = 0;
for (int i = 0; i < (x + y); i++) {
s += a[i];
a[i] += 25;
}
bool p[MAX+1][MAX * MAX + 1];
memset(p, 0, sizeof(p));
p[0][0] = 1;
for (int i = 0; i < (x + y); i++) {
for (int k = min(x, i + 1); k >= 1; k--) {
for (int j = 0; j < MAX * MAX + 1; j++) {
if (p[k - 1][j]) p[k][j + a[i]] = 1;
}
}
}
int min_value = INF;
for (int i = 0; i < MAX * MAX + 1; i++) {
if (p[x][i]) {
int tmp = i - 25 * x;
min_value = min(min_value, tmp * (s - tmp));
}
}
cout << "Minimum Value: " << min_value;
}
int main() {
int x = 2, y = 2;
int ar[] = {7, 6, 4, 3};
MinValue(ar, x, y);
return 0;
}
ผลลัพธ์
Minimum Value: 91