贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择,不从整体最优上加以考虑,算法得到的是局部最优解。这里给出一道例题。
题面
思路
首先,当前数字最大时应该是
- 位数最多
- 尽量往前的位数越大越好
考虑最大的位数
for (int i = 1; i <= 9; i++) {
scanf("%d", &a[i]);
if(a[i]<=minn){
minn=a[i];
x=i;
}
}
int len = v/minn;
if (len == 0) {
printf("-1\n");
return 0;
}
for (int i = 0; i < len; i++) {
ans[i] = x;
}
位数不变的情况下,最大的数字
计算出剩余的能量后,每次查找最靠前的位数,选择当前可以选择的最大数字并进行修改。
int res = v % minn; // 剩余的能量
for(int i=0;i<len;i++){
for(int j=9;j>x;j--){
if(res>=a[j]-minn){
ans[i]=j;
res=res-a[j]+minn;
break;
}
}
}
代码实现
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int a[10], ans[maxn];
int main() {
int v;
scanf("%d", &v);
int minn = 100010, x;
for (int i = 1; i <= 9; i++) {
scanf("%d", &a[i]);
if(a[i]<=minn){
minn=a[i];
x=i;
}
}
int len = v/minn;
if (len == 0) {
printf("-1\n");
return 0;
}
for (int i = 0; i < len; i++) {
ans[i] = x;
}
int res = v % minn; // 剩余的能量
int idx = 0;
int flag=0;
for(int i=0;i<len;i++){
for(int j=9;j>x;j--){
if(res>=a[j]-minn){
ans[i]=j;
res=res-a[j]+minn;
break;
}
}
}
for (int i = 0; i < len; i++) {
printf("%d", ans[i]);
}
return 0;
}