算法
背包问题
#include <cstdio>
#include <cstring>
using namespace std;
int T, n, sum, w[205], lim; // w[i]: 物品 i 的价值
bool dp[20005];
int main() {
while (1 == scanf("%d", &T)) {
while (T-->0) {
sum = 0;
scanf("%d", &n); // 输入物品总数
for (int i = 0; i < n; ++i) {
scanf("%d", w + i); // 逐个输入物品价值 from i = 0 ... 1
sum += w[i];
}
lim = sum >> 1; // 取总和的一半为背包容量上限
memset(dp, false, sizeof(dp));
dp[0] = true;
for (int i = 0; i < n; ++i) {
for (int j = lim; j >= w[i]; --j) {
if (dp[j - w[i]])
dp[j] = true;
}
}
for (int i = lim; i >= 0; --i) {
if (dp[i]) { // 找到最大的可达到的 sum
printf("%d\n", sum - i - i);
break;
}
}
}
}
}
从物品 0
到 n
(选中物品 i
)
快速排序
def quick_sort(a, start, end):
if end == start:
return
i, j = start, end
key = a[i]
while i != j:
while a[j] >= key:
j -= 1
if i == j:
break
if i == j:
break
a[i] = a[j]
while a[i] <= key:
i += 1
if i == j:
break
if i == j:
break
a[j] = a[i]
a[i] = key
quick_sort(a, start, i - 1)
quick_sort(a, i + 1, end)
a = [2, 3, 1]
quick_sort(a, 0, len(a)-1)
print(a)