HDU_1864最大报销额 网上其他很多代码都水过去的

很坑爹的题目,3 A:100 A:200 A:400  这种算A的单项大于600,我最开始看题以为这种数据不需要丢弃,导致wrong了好几次

接下来就是简单的01背包了,做完这题之后在网上看别人的代码,发现看不懂。。 然后研究了很久,发现这堆看不懂的代码都是水过去的,他们都过不了下面这组数据

1000 3
2 A:200 A:400
1 A:500
1 C:400
999 3
2 A:200 A:400
1 A:500
1 C:400
3.00 14
1 A:0.01
1 A:0.02
1 A:0.04
1 A:0.08
1 A:0.16
1 A:0.32
1 A:0.64
1 A:1.28
1 A:2.56
1 A:5.12
1 A:10.24
1 A:20.48
1 A:40.96
1 A:81.92


我至今也没看懂他们代码想干啥,但是我能确定他们代码有问题。而且好多人的代码都错了。

我的代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char dp[3000010];
char dp2[3000010];
int max ;
int main()
{
char buf[64];
int n;
int flag = 1;
int price;
char *pbuf;
float price_temp;
int need_price;
int total_price[30];
int i,j;
int m;
int a,b,c;
while(scanf("%f%d", &price_temp, &n) != -1)
{
if(n == 0)
break;
memset(total_price, 0, sizeof(total_price));
memset(dp, 0, sizeof(char) * n * 100000 + 1);
memset(dp2, 0, sizeof(char) * n * 100000 + 1);
max = 0;
need_price = (int)(price_temp*100);


for(i = 0; i < n; i++)
{
scanf("%d", &m);

flag = 1;
a = 0;
b = 0;
c = 0;
for(j = 0; j < m; j++)
{
scanf("%s", buf);
if(buf[0] == 'A' || buf[0] == 'B' || buf[0] == 'C')
{
price = atoi(&buf[2]);
if(price > 600)
{
flag = 0;
}
price*=100;
if((pbuf = strstr(buf, ".")) != NULL)
{
price+= atoi(pbuf+1);
}
if(buf[0] == 'A')
{
a += price;
}
else if(buf[0] == 'B')
{
b += price;
}
else if(buf[0] == 'C')
{
c += price;
}
if(a > 60000 || b > 60000 || c > 60000)
{
flag = 0;
}


total_price[i] += price;
if(total_price[i] > 100000)
{
flag = 0;
}
}
else
{
flag = 0;
}
if(flag == 0)
{
total_price[i] = 0;
}
}
}
dp[0] = 1;
dp2[0] = 1;
for(i = 0; i < n; i++)
{
price = total_price[i];
if(price == 0)
continue;
for(j = 0; j <= max && j <= need_price; j++)
{
if(dp[j] == 1)
{
dp2[j + price] = 1;
}
}
max += price;
memcpy(dp, dp2, (max+1) * sizeof(char)); 
}
if(need_price > 100000*30)
i = 100000*30;
else
i = need_price;
for(; i >=0; i--)
{
if(dp[i] == 1)
{
printf("%.2lf\n", (double)i/100);
break;
}
}
}
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值