UVa 11450 - Wedding shopping
2024-10-18 21:16:48
题目大意:我们的朋友Bob要结婚了,所以要为他买一些衣服。有m的资金预算,要买c种类型的衣服(衬衫、裤子等),而每种类型的衣服有k个选择(只能做出一个选择),每个选择的衣服都有一个价格,问如何选择才能使花费控制在预算范围内并使得花费尽量大?输出最大花费。
用dp进行解决,bool dp[i][j]用以表明在买完第i种类型的衣服后是否可能有j的资金剩余。递推至dp[c][],找出dp[c][]中最小的资金剩余。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; struct Garment
{
int size;
int model[];
} garment[];
bool dp[][]; int main()
{
#ifdef LOCAL
freopen("in", "r", stdin);
#endif
int T;
scanf("%d", &T);
while (T--)
{
int m, c;
scanf("%d%d", &m, &c);
for (int i = ; i <= c; i++)
{
scanf("%d", &garment[i].size);
for (int j = ; j < garment[i].size; j++)
scanf("%d", &garment[i].model[j]);
sort(garment[i].model, garment[i].model+garment[i].size);
}
int lowest = ;
for (int i = ; i <= c; i++)
lowest += garment[i].model[];
if (lowest > m)
{
printf("no solution\n");
continue;
}
memset(dp, , sizeof(dp));
dp[][m] = ;
for (int i = ; i <= c; i++)
{
for (int j = ; j <= m; j++)
if (dp[i-][j])
{
for (int p = ; p < garment[i].size; p++)
if (j - garment[i].model[p] >= )
dp[i][j-garment[i].model[p]] = ;
}
}
int p = ;
while (!dp[c][p]) p++;
printf("%d\n", m-p);
}
return ;
}
开始是把数据保存在garment[0...c-1]中,后来改为garment[1...c],却忘了在计算lowest时进行修改,WA了一次,以后记得修改完东西后检查一下是否对其他地方有影响,不要简单地依靠样例给的测试数据。
最新文章
- phabricator-zh_CN汉化包
- JQuery中Ajax的操作
- 介绍对称加密的另一个算法——PBE
- 使用JCIFS获取远程共享文件
- Yii2.0中form->;field如何获取主表的一个字段并且设置为只读
- 4197: [Noi2015]寿司晚宴
- 【转】AVL
- mysql 常用语法
- 关于MySQL MyISAM 表并发
- AWS ec2 vpn 搭建(20161014更新http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm)
- Mac本地编辑服务器代码
- 一:Redis的7个应用场景
- hackathon活动复盘
- 为什么MIP-Cache存在
- Storm UI说明
- JavaScript 原型链学习(四)原型链的基本概念、原型链实现继承
- CSS margin属性与用法教程
- 使用对象作为hashMap的键,需要覆盖hashcode和equals方法
- Nginx内置的嵌入变量
- 批处理学习笔记11 - del命令和rd命令