1.给定一个环,每个点上都有数额不等的红包,不能同时拿相邻两个红包,请问最多能拿多少?
这题开始想的这不是典型的动态规划吗。然后做起来发现,有些不对,比如说取第一个,因为成环的关系,那么最后一个是注定不能取的。但是万一最后一个红包比较多呢?越想越复杂,后来想到,动态规划是后面的状态依赖于前面的状态,但此处,后面的状态(比如取最后一个)显然是对前面的状态有反过来的影响,所以不能用动态规划做。但是此处感觉不用动态规划感觉没什么方法。所以考虑将它分解成三种情况,分别用动态规划来做,我实在是想不出有什么方法了。哎。。
#include <iostream>
#include <algorithm>
#define N 7
using namespace std;
int main()
{
int a[N] = { 1, 2, 3, 4, 5,6,7};
int d[N];
d[0] = a[0];
d[1] = max(a[0], a[1]);
if (N <= 3)
{
d[2] = max(max(a[0], a[1]), a[2]);
cout << d[N - 1] << endl;
return 0;
}
//a[0],a[N-1]不取
int maxval = 0;
d[1] = a[1];
d[2] = max(a[1], a[2]);
for (int i = 3; i < N; i++)
{
d[i] = max(d[i - 1], d[i - 2] + a[i]);
if (d[i]>maxval)
maxval = d[i];
}
//取a[0]
d[0] = a[0];
d[1] = max(a[0], a[1]);
for (int i = 2; i < N-1; i++)
{
d[i] = max(d[i - 1], d[i - 2] + a[i]);
if (d[i]>maxval)
maxval = d[i];
}
//取a[N-1]
d[0] = a[N - 1];
d[1] = d[0];
for (int i = 2; i < N - 1; i++)
{
d[i] = max(d[i - 1], d[i - 2] + a[i-1]);
if (d[i]>maxval)
maxval = d[i];
}
cout << maxval << endl;
return 0;
}
2.买苹果:买了n个苹果。超市有袋子,只有两种规格,分别是装6个和装8个,如果买的苹果正好能装整数个袋子,就输出能使用 的袋子的最小的数值,如果不能恰好装,输出-1;
这题我看题目给的约束是苹果数在1-100之间,想的不是很大,于是我用递归做的
#include <iostream>
using namespace std;
bool apple(int n,int& count)
{
if (n == 0)
return true;
if ((n < 6 && n >= 1) || n == 7 || n<0)
return false;
if (apple(n - 8, count))
{
count++;
return true;
}
if (apple(n - 6, count))
{
count++;
return true;
}
return false;
}
int main()
{
int num;
cin >> num;
int daishu = 0;
if (apple(num, daishu))
cout << daishu << endl;
else
cout << -1 << endl;
}
估计在苹果数很多的情况下空间或时间不符要求,看网上有人用了循环
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num;
cin >> num;
int ans = 1000; //苹果数不能到1000
for (int i = 0; i < 20; i++)
{
for (int j = 0; j < 20; j++)
{
if (6 * i + 8 * j == num)
{
ans = min(ans, (i + j));
}
}
}
if (ans == 1000)
ans = -1;
cout << ans << endl;
return 0;
}
3.输入一个数,分别用它表示成2到N-1进制,然后对这些进制表示的数把它当成十进制求和,求它的进制和的平均数。结果用分数表示,需要约分到最简形式
比如说一个数4,它的2进制表示为100,三进制表示为11,所以它的和是111,平均为111/2,输出就以这种格式输出。
#include <iostream>
using namespace std;
int jinzhi(int n, int num)
{
int sum = 0;
while (n)
{
sum += (n%num);
n = n / num;
}
return sum;
}
int gongyueshu(int num1, int num2)
{
if (num1 % num2 == 0)
return num2;
int r;
while (num1 % num2)
{
r = num1 % num2;
num1 = num2;
num2 = r;
}
return num2;
}
int main()
{
int n;
cin >> n;
int sum = 0;
int count = 0;
for (int i = 2; i < n; i++)
{
sum += jinzhi(n, i);
count++;
}
int yueshu = gongyueshu(sum, count);
cout << sum / yueshu << "/" << count / yueshu << endl;
return 0;
}