2019 小米校招笔试题 小米大礼包
小米之家是成人糖果店。里面有很多便宜,好用,好玩的产品。中秋节快到了,小米之家想给米粉们准备一些固定金额大礼包。对于给定的一个金额,需要判断能不能用不同种产品(一种产品在礼包最多出现一次)组合出来这个金额。聪明的你来帮帮米家的小伙伴吧。输入描述:输入 N (N 是正整数, N<= 200)输入 N 个价格p(正整数, p <= 10000)用单空格分割输入金额 M(M...
·
小米之家是成人糖果店。里面有很多便宜,好用,好玩的产品。中秋节快到了,小米之家想给米粉们准备一些固定金额大礼包。对于给定的一个金额,需要判断能不能用不同种产品(一种产品在礼包最多出现一次)组合出来这个金额。聪明的你来帮帮米家的小伙伴吧。
输入描述:
输入 N (N 是正整数, N <= 200) 输入 N 个价格p(正整数, p <= 10000)用单空格分割 输入金额 M(M是正整数,M <= 100000 )
输出描述:
能组合出来输出 1 否则输出 0
示例1
输入
6 99 199 1999 10000 39 1499 10238
输出
1
典型的01背包问题
思路: 每件商品有选和不选两种状态,
动态规划 dp[i][j] 表示前i个商品是否能组成价格为j
转移方程为 dp[i][j] = dp[i-1][j] || (j>=num[i] && dp[i-1][j-num[i]])
#include <iostream>
using namespace std;
const int N = 250;
const int M = 100100;
int num[N];
bool dp[N][M];
int main()
{
int n,m;
cin>>n;
dp[0][0] = true;
for(int i=1;i<=n;i++) {
cin>>num[i];
dp[i][0] = true;
}
cin>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[i][j] = dp[i-1][j] || (j>=num[i] && dp[i-1][j-num[i]]);
}
}
cout<<dp[n][m]<<endl;
system("pause");
}
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)