CCF-CSP练习 何以包邮?
CCF 202209-2 何以包邮?
文章目录
题目描述
输入格式
输出格式
输出到标准输出。
仅输出一个正整数,表示在满足包邮条件下的最小花费。
样例1输入
4 100
20
90
60
60
样例1输出
110
样例1解释
购买前两本书(20+90)即可包邮且花费最小。
样例2输入
3 30
15
40
30
样例2输出
30
样例2解释
仅购买第三本书恰好可以满足包邮条件。
样例3输入
2 90
50
50
样例3输出
100
样例3解释
必须全部购买才能包邮。
子任务
提示
对于70%的测试数据,直接枚举所有可能的情况即可。
我的提交1(70分 枚举法,位运算)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x,a[35];
cin>>n>>x; //购物车中图书数量和包邮条件
int i,j,k=1;
for(i=1;i<=n;i++){//0
cin>>a[i]; //表示购物车中第i本书的价格
k*=2; //总情况数
}
int minc=0x3f3f3f3f;
for(i=1;i<k;i++){
int temp=i,cost=0;
for(j=0;j<n;j++){
cost+=a[j+1]*(temp>>j&1); //位运算
}
if(cost<minc&&cost>=x) minc=cost;//cost>=x
}
cout<<minc<<endl;
return 0;
}
提交结果1
我的提交2(100分 0/1背包问题)
#include<bits/stdc++.h>
using namespace std;
int dp[35][300005]; 前[]件商品中在[]价格下的最大花费,注意这里的范围要*30
int main()
{
int n,x;
cin>>n>>x; //分别表示购物车中图书数量和包邮条件
int i,j,a[35],sum=0;
for(i=1;i<=n;i++) //i=1开始
{
cin>>a[i]; //第i本书的价格
sum+=a[i]; //商品总价格
}
//定义全局变量就初始化了,所以dp[0][0]=0;就不用了
for(i=1;i<=n;i++){ //遍历商品数i=1开始
for(j=0;j<=sum;j++){//遍历总价格<=sum
if(a[i]<=j){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);
}
else dp[i][j]=dp[i-1][j];
}
}
for(j=x;j<=sum;j++){ //<=sum
if(dp[n][j]>=x){ //>=x
cout<<dp[n][j]<<endl;
return 0;
}
}
}
提交结果2
学习参考
https://blog.csdn.net/weixin_52050936/article/details/127284862?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171172653916800182185583%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=171172653916800182185583&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-127284862-null-null.142v100pc_search_result_base4&utm_term=%E4%BD%95%E4%BB%A5%E5%8C%85%E9%82%AE%E6%9A%B4%E5%8A%9B%E6%9E%9A%E4%B8%BE%E4%BD%8D%E8%BF%90%E7%AE%97&spm=1018.2226.3001.4187