We have the 0-1 knapsack problem: Given a capacity $B\in\mathbb{R}^+$ and $n$ items of values $v_1,\ldots,v_n\in\mathbb{R}^+$ and weights $s_1,\ldots,s_n\in\mathbb{R}^+$ (we can assume that $s_i\leq B$ for all $i$), find $I\subseteq\{1,\ldots,n\}$ that maximizes $\sum_{i\in I}v_i$ among all $J\subseteq\{1,\ldots,n\}$ such that $\sum_{j\in J}s_i\leq B$.
There is a greedy $2$-approximation algorithm that proceeds as follows: Order the items so that $$v_1/s_1\leq v_2/s_2\leq\cdots\leq v_n/s_n.$$ Then just greedily include items in this ordering as long as you can, i.e., find index $j\in\{1,\ldots,n\}$ such that $$\sum_{i=1}^j s_i\leq B\text{ and }\sum_{i=1}^{j+1} s_i>B.$$
Then, we return $$\max\left(v_{j+1},\sum_{i=1}^j v_i\right).$$
The claim is that this algorithm is $2$-approximation. To show this, it is enough to show that $$\sum_{i=1}^{j+1}v_i\geq\text{OPT},$$ where $\text{OPT}=\sum_{i\in I^*}v_i$ is the optimum.
This can be proved by considering the linear program $$\max\sum_{i=1}^n v_i x_i\text{ subject to }\sum_{i=1}^n s_ix_i\leq B\text{ and }0\leq x_i\leq 1\text{ for all }i\in\{1,\ldots,n\}.$$ This is a linear relaxation of the natural IP formulation of the knapsack problem. The optimum of the linear program is clearly of the form $x^*=(1,\ldots,1,\alpha,0,\ldots,0)$ with $\alpha\in [0,1)$, where $\alpha$ is on the $(j+1)$-th coordinate. Then, $$\text{OPT}=\text{OPT}_\text{IP}\leq\text{OPT}_\text{LP}=\sum_{i=1}^n v_ix^*_i\leq\sum_{i=1}^{j+1}v_i.$$
My question: However, this proof somehow doesn't feel satisfactory to me, since we are using linear programming, which just seems like too big of a hammer for this job. I am looking for a straightforward but rigorous proof without LP.
What I tried: We know that $$\sum_{i=1}^{j+1}s_i>B\geq\sum_{i\in I^*}s_i.$$ If we assume $\sum_{i=1}^{j+1}v_i<\text{OPT},$ then we obtain $$\frac{\sum_{i=1}^{j+1}v_i}{\sum_{i=1}^{j+1}s_i}<\frac{\sum_{i\in I^*}v_i}{\sum_{i\in I^*}s_i}.$$
It feels like there should be a contradiction here, since these fractions are the "densities" of the sets of items and the greedy algorithms is picking the "densest" ones. But I don't know how to go from here.