昨日总结
刷题数:2
学习时长:7.5h
问题一
签到气球题
解题思路:先用结构体定义团队编号,问题编号(整型数据)和问题结果,输入数据,进行循环,每次循环中定义struct team game用来给struct tame race[1010]赋值,再定义一个字符用来表示题目编号,由此结构体中的(整型)问题编号就等于该字符减去字符’A’,当问题结果为AC时,将所有正确的序列赋给结构体race,然后定义一个二维数组,用来存放结果,二维数组列数组是表示团队编号,行数组是表示问题编号,将所有正确的题全赋值为1,再利用前缀和将所有的值加起来,某团队的值为多少就是对了几道题,最后输出结果。
难点:如何防止某团队对过的题目再次判对。
问题二
动态规划01背包问题
大概题目:有N件物品和一个容纳重量为V的背包,第i件物品的重量为w[i],价格为p[i],求解将哪些物品放进背包可使价值总量最大。(每种物品最多选一次)
解法:(从第一件物品开始)
一、如果装不下当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。
二、如果装得下当前物品。
假设1:装当前物品,在给当前物品预留了相应空间的情况下,前n-1个物品的最佳组合加上当前物品的价值就是总价值。
假设2:不装当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。
选取假设1和假设2中较大的价值,为当前最佳组合的价值。
例如:
解题思路:首先定义一个浮点型函数,用来判断两个浮点数数的大小,定义整型的V(已知modf(V)>=0.01,后面输入浮点型数据z,用z*100来表示,同理将所有物品的体积也扩大100),方便运算,再定义一个浮点型数组用来存放结果,并将该数组赋值为0,运用嵌套循环进行推导,当某物品的体积大于背包所能容纳的体积时,循环结束,否则,利用先前的浮点型函数将当前物品的价值和原定组合物品的价值进行比较,取两者之间的大者,最后输出bag[V],即本题答案。
关键代码:
for(i=1;i<=K;i++)
{
for(j=V;j>0;j–)
{
if(j<S[i]) break;
bag[j]=max(bag[j],bag[j-S[i]]+P[i]);
}
}