博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【wikioi】1025 选菜
阅读量:5889 次
发布时间:2019-06-19

本文共 1242 字,大约阅读时间需要 4 分钟。

算法:01背包DP

此题主要是预处理恶心。我提交了2次。。。第一次数组开小了。。。(体积要=V*10)

注意:

钱做为体积,美味价值作为价值

注意,因为体积(钱)是小数点后1位,故数组下标无法表示体积(01背包),所以体积(钱)要扩大10倍作为01背包的体积

还有因为有重复的,所以要去重再01

代码:

#include 
#include
using namespace std;//钱做为体积,美味价值作为价值//注意,因为体积(钱)是小数点后1位,故数组下标无法表示体积(01背包)。所以要扩大10倍,输出答案再缩小10倍//还有因为有重复的,所以要去重再01const int MAXN = 105;int t[MAXN], n, k, V; //t代表种类int v1[MAXN], w1[MAXN]; //v1代表价格(体积),w1代表美味价值(价值)(去重前)int v[MAXN], w[MAXN], nn = 0; //v代表价格(体积),w代表美味价值(价值)int f[MAXN*10];bool m[MAXN]; //m[i]表示第i种是否被购买int ans = 0;int main(){ int i, j; double temp; int tem; cin >> n >> k >> temp; V=(int)(temp*10); for(i = 1; i <= n; i++) {cin >> temp; v1[i] = (int)(temp*10);} for(i = 1; i <= n; i++) cin >> w1[i]; for(i = 1; i <= n; i++) cin >> t[i]; for(i = 1; i <= k; i++) { cin >> tem; m[tem] = 1; //必买种类已经用过的标志 for(j = 1; j <= n; j++) //先处理必须买的 if(tem == t[i]) { ans += w1[i]; V -= v1[i]; //必须买的后减小体积 break; } } //题目说数据中不会出现小松带的钱不够买必买菜的情况,所以不用判断买完必要的后钱不够的情况 if(V == 0) {cout << ans << endl;return 0;} for(i = 1; i <= n; i++) if(!m[t[i]]) //这种种类没有访问过 w[++nn]=w1[i], v[nn]=v1[i], m[t[i]]=1; //01背包 for(i = 1; i <= nn; i++) for(j = V; j >= v[i]; j--) f[j] = max(f[j], f[j-v[i]]+w[i]); cout << ans+f[V] << endl; return 0;}

 

 

 

转载地址:http://dxysx.baihongyu.com/

你可能感兴趣的文章
【java】path和classpath
查看>>
UVa 10057 - A mid-summer night's dream
查看>>
解决3 字节的 UTF-8 序列的字节 3 无效
查看>>
浅谈浏览器兼容性问题-(1)产生、看待与思
查看>>
iOS8中定位服务的变化(CLLocationManager协议方法不响应,无法回掉GPS方法,不出现获取权限提示)...
查看>>
BeanUtils\DBUtils
查看>>
VC 创建托盘,托盘tooltip。右键托盘菜单,点击别的地方会隐藏掉的问题。
查看>>
第一天,新的定义
查看>>
WPF EventSetter Handler Command
查看>>
polya定理,环形涂色
查看>>
day4-装饰器前奏
查看>>
forward和redirect的区别
查看>>
使用JavaMail完成邮件的编写
查看>>
洛谷P1576 最小花费
查看>>
封装了一个类,可生成验证码,缩略图,及水印图
查看>>
第一阶段项目总结
查看>>
Java集合详解
查看>>
myeclilpse打开文件所在位置的图标消失后的找回方法
查看>>
Android利用文本分割拼接开发一个花藤文字生成
查看>>
哈夫曼树的实现
查看>>