一、买口罩
题目描述
小明有N元钱去药店买口罩,药店里有6个品牌的口罩,A品牌2个装(2元)、B品牌3个装(2元)、C品牌1个装(3元)、D品牌5个装(1元)、E品牌4个装(5元)、F品牌3个装(2元),由于限购每个品牌最多只能买一个,小明最多能买多少口罩?
思路分析
这是一个01背包问题,可以将上述六个品牌的口罩视为六种不同的物品。转换一下思维之后,小明的N元钱可以视为背包容量,每种物品的价格可以视为体积,装的口罩个数可以视为其价值。每种物品最多只能选一次,求最大价值。
AC代码(C++)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int v[] = {2, 2, 3, 1, 5, 2}; // 每件物品的体积
int w[] = {2, 3, 1, 5, 4, 3}; // 每件物品的价值
int dp[20] = {0}; // 1 < N < 15
int N;
cin >> N;
for(int i = 0; i < 6; i ++)
{
for(int j = N; j >= v[i]; j --)
{
dp[j] = max(dp[j], dp[j - v[i]] + w[i]);
}
}
cout << dp[N];
return 0;
}
二、三角形的三边和
题目描述
三角形有三个边s1,s2,s3,边s1有四个圆圈⭕1,2,3,4,边s2有四个圆圈⭕4,5,6,7,边s3有四个圆圈⭕7,8,9,1。
把1-9这9个数字,分别填写到以上9个圆圈里,9个圆圈里的数字不能重复,对于每组输入,如果每条边上的4个圆圈⭕的和相等,输出"yes",否则输出"no"。
思路分析
只需要根据题意判断各条边上的数字和是否相等即可。这道题的输入是通过逗号分隔9个数字,因此需要特别处理输入。
AC代码(C++)
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string str;
cin >> str;
if(str[0] + str[2] + str[4] + str[6] == str[6] + str[8] + str[10] + str[12] && str[6] + str[8] + str[10] + str[12] == str[12] + str[14] + str[16] + str[0])
{
cout << "yes";
}
else
{
cout << "no";
}
return 0;
}