今天上午是考试。。
\(T1\) 购物
贪心,然而我并没有想出来,写了个错误的时间复杂度极高的贪心,水了40分。
如果可选面值里没有\(1\),显然是无解的,否则一定有解。
定义一个变量\(sum\)表示当前已经能拼出的最大面额,初始为\(0\),
然后
while(sum < x){
for(int i = n; i; --i)
if(sum + 1 >= a[i]){
sum += a[i];
break;
}
++ans;
}
如果当前拼不出下一个数,就找到最大的小于等于下一个数的面额\(a[i]\),那么显然\(sum+a[i]\)以内都是可以拼出了的,因为\(sum\)以内是已经确定可以拼出的了,所以\(a[i]+1,a[i]+2,...,a[i]+sum\)都是可以拼出的了。
\(T2\) 养猪
并没有想到这是一个背包。。仍然贪心乱搞,不记得多少分了。
如果体重不会减少,这显然就是个裸的\(01\)背包,但这里体重会减少,也就是说每件物品的价值本身恒定不变的。